class Chess<T> {
private T xxx;
//setter/getter
}
public class TestGeneric {
public static void main(String[] args) {
Chess<Integer> c1 = new Chess<Integer>();
Chess<String> c2 = new Chess<String>();
Chess<? extends List<String>> c3 = new Chess<ArrayList<String>>();
Chess<? extends List<Integer>> c4 = new Chess<LinkedList<Integer>>();
Chess<? super Integer> c5 = new Chess<Number>();
c5.setXxx(111);
System.out.println(c5.getXxx());
Chess c6 = new Chess<>();
c6.setXxx(123);
System.out.println(c6.getXxx());
Chess<?> c7 = c6;
System.out.println(c7.getXxx());
c7.setXxx(null);
System.out.println(c7.getXxx());
//c7.setXxx(456);
}
}
※Chess類別的T為呼叫者決定什麼型別,就是什麼型別,如c1~c5,如果沒有泛型就要寫很多類似的類別了
※c3、c4只能是List的兒子
※c5只能是Integer的爸爸
※c6和c7的差別在有沒有泛型
c6(沒有泛型)塞值後給有問號泛型的c7
c7能印出來,也能把它變null
但不能塞值,這就是兩者的差別
如果能塞值也很奇怪,因為宣告問號了,java怎麼知道你要塞什麼值?
所以直接給編譯錯誤
※問號可以使用強轉,但要轉成正確的型態
※和泛型方法配合使用,泛型方法可以覆蓋泛型類別,但會有警告,叫你用 hiding
※泛型類別不能用在 static 方法
沒有留言:
張貼留言