まず、クラスで許容される型を制限し、フィールドをNumber
他のフィールドと比較するメソッドを導入し、次のGenericNumber
ようなジェネリック クラスを定義します。
public class GenericNumber<T extends Number> {
private T number;
public T getNumber() {
return number;
}
public void setNumber(T number) {
this.number = number;
}
public void setNumber(T number) {
this.number = number;
}
//constructors
public int compareTo(Number n) throws Exception {
if((number == null) || (n == null))
throw new Exception("Can't compare null values");
else if(number.doubleValue() > n.doubleValue)
return 1;
else if(number.doubleValue() == n.doubleValue)
return 0;
else
return 1;
}
public int compareTo(GenericNumber n) throws Exception {
if(n == null)
throw new Exception("Can't compare null values");
return compateTo(n.getNumber());
}
}
このアプローチでは、インスタンスの等価性のテストは、オブジェクトを使用して次の条件に変換されます: (r.compareTo(g) == 0)
.
このタイプの Java フレーバーの比較クラス メソッドを使用したくない場合は、もちろん、フィールドを型キャストし、=
演算子で比較できます。
Integer は Number のサブタイプですが、 はGenericNumber<Integer>
のサブタイプではないため、予想される動作では正しくありません。GenericNumber<Number>
それを理解するために、あなたのケースで のインスタンスで set メソッドを呼び出したいとしますGenericNumber<Number>
:
GenericNumber<Integer> i = new GenericNumber<Integer>();
Integer ii = 3;
i.setNumber(ii);
GenericNumber<Number> n = i;//suppose it will be consumed by compiler
//in this case it will be tempting to forget about i and use n instead, like in the following lines
Folat f = 2.5f;
n.setNumber(f);
//would be valid because method signature will be
//public void Number setNumber(Number number)
//but what actually happens is that you will try to call method of class
//GenericNumber<Integer> with signature public void Integer setNumber(Integer number)
ご覧のとおり、最後の行でエラーが発生するため、ジェネリックは注意して使用する必要があります。
ところで、当時は Sun、現在は Oracle のサイトのジェネリックに関するチュートリアル セクション、つまり
http://docs.oracle.com/javase/tutorial/java/generics/index.htmlおよび/または
http:/ /docs.oracle.com/javase/tutorial/extra/generics/index.html .