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 方法
沒有留言:
張貼留言