首先,我會在你的類限制可以接受的類型,並介紹方法比較場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風格的比較類方法,那麼當然可以對字段進行類型轉換並與=
運算符進行比較。
對於你期望的行爲,做出這樣的分配是不對的,因爲GenericNumber<Integer>
不是GenericNumber<Number>
的子類型,就像我們的直覺暗示的那樣,雖然Integer是Number的子類型。據瞭解,假設你的情況,你想調用一組方法上的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)
正如你看到的,最後一行會產生錯誤,所以你需要使用泛型謹慎。
順便說一句,在當時的太陽,現在甲骨文網站的泛型教程節是值得一遊,即: http://docs.oracle.com/javase/tutorial/java/generics/index.html和/或 http://docs.oracle.com/javase/tutorial/extra/generics/index.html。
類型轉換它'GenericTest1 R =(GenericTest1 )克; ' –
@ShashankKadne類型轉換將不起作用 - 它仍然不能編譯。 –