2015年10月14日 星期三

泛型類別和問號

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 方法

沒有留言:

張貼留言