src/share/classes/javax/swing/SpinnerNumberModel.java
Print this page
@@ -82,11 +82,20 @@
*/
@SuppressWarnings("serial") // Superclass is not serializable across versions
public class SpinnerNumberModel extends AbstractSpinnerModel implements Serializable
{
private Number stepSize, value;
- private Comparable minimum, maximum;
+ // Both minimum and maximum are logically Comparable<? extends
+ // Number>, but that type is awkward to use since different
+ // instances of Number are not naturally Comparable. For example,
+ // a Double implements Comparable<Double> and an Integer
+ // implements Comparable<Integer>. Neither Integer nor Double will
+ // have a bridge method for Comparable<Number>. However, it safe
+ // to cast Comparable<?> to Comparable<Object> since all
+ // Comparables will have a compare(Object> method, possibly as a
+ // bridge.
+ private Comparable<?> minimum, maximum;
/**
* Constructs a <code>SpinnerModel</code> that represents
* a closed sequence of
@@ -115,16 +124,20 @@
*
* @throws IllegalArgumentException if stepSize or value is
* <code>null</code> or if the following expression is false:
* <code>minimum <= value <= maximum</code>
*/
- public SpinnerNumberModel(Number value, Comparable minimum, Comparable maximum, Number stepSize) {
+ @SuppressWarnings("unchecked") // Casts to Comparable<Object>
+ public SpinnerNumberModel(Number value,
+ Comparable<?> minimum,
+ Comparable<?> maximum,
+ Number stepSize) {
if ((value == null) || (stepSize == null)) {
throw new IllegalArgumentException("value and stepSize must be non-null");
}
- if (!(((minimum == null) || (minimum.compareTo(value) <= 0)) &&
- ((maximum == null) || (maximum.compareTo(value) >= 0)))) {
+ if (!(((minimum == null) || (((Comparable<Object>)minimum).compareTo(value) <= 0)) &&
+ ((maximum == null) || (((Comparable<Object>)maximum).compareTo(value) >= 0)))) {
throw new IllegalArgumentException("(minimum <= value <= maximum) is false");
}
this.value = value;
this.minimum = minimum;
this.maximum = maximum;
@@ -210,11 +223,11 @@
* the same type as <code>value</code>
* @see #getMinimum
* @see #setMaximum
* @see SpinnerModel#addChangeListener
*/
- public void setMinimum(Comparable minimum) {
+ public void setMinimum(Comparable<?> minimum) {
if ((minimum == null) ? (this.minimum != null) : !minimum.equals(this.minimum)) {
this.minimum = minimum;
fireStateChanged();
}
}
@@ -224,11 +237,11 @@
* Returns the first number in this sequence.
*
* @return the value of the <code>minimum</code> property
* @see #setMinimum
*/
- public Comparable getMinimum() {
+ public Comparable<?> getMinimum() {
return minimum;
}
/**
@@ -257,11 +270,11 @@
* the same type as <code>value</code>
* @see #getMaximum
* @see #setMinimum
* @see SpinnerModel#addChangeListener
*/
- public void setMaximum(Comparable maximum) {
+ public void setMaximum(Comparable<?> maximum) {
if ((maximum == null) ? (this.maximum != null) : !maximum.equals(this.maximum)) {
this.maximum = maximum;
fireStateChanged();
}
}
@@ -271,11 +284,11 @@
* Returns the last number in the sequence.
*
* @return the value of the <code>maximum</code> property
* @see #setMaximum
*/
- public Comparable getMaximum() {
+ public Comparable<?> getMaximum() {
return maximum;
}
/**
@@ -315,11 +328,11 @@
*/
public Number getStepSize() {
return stepSize;
}
-
+ @SuppressWarnings("unchecked") // Casts to Comparable<Object>
private Number incrValue(int dir)
{
Number newValue;
if ((value instanceof Float) || (value instanceof Double)) {
double v = value.doubleValue() + (stepSize.doubleValue() * (double)dir);
@@ -327,12 +340,11 @@
newValue = new Double(v);
}
else {
newValue = new Float(v);
}
- }
- else {
+ } else {
long v = value.longValue() + (stepSize.longValue() * (long)dir);
if (value instanceof Long) {
newValue = Long.valueOf(v);
}
@@ -345,14 +357,14 @@
else {
newValue = Byte.valueOf((byte)v);
}
}
- if ((maximum != null) && (maximum.compareTo(newValue) < 0)) {
+ if ((maximum != null) && (((Comparable<Object>)maximum).compareTo(newValue) < 0)) {
return null;
}
- if ((minimum != null) && (minimum.compareTo(newValue) > 0)) {
+ if ((minimum != null) && (((Comparable<Object>)minimum).compareTo(newValue) > 0)) {
return null;
}
else {
return newValue;
}