泛型 協變 逆變 java
解釋: PECS 《Effective Java》的描述:producer-extends, consumer-super(PECS)。
A為B的子類,記為A ≦ B ,f(A) 暫且理解為由A構造出來的型別,下面為協變、逆變定義
當A ≦ B時,如果有f(A) ≦ f(B),那麼f叫做協變;
當A ≦ B時,如果有f(B) ≦ f(A),那麼f叫做逆變;
如果上面兩種關係都不成立則叫做不可變。
基本概念理解,下面舉個例子:
java 泛型無逆變、協變,稱為不變,舉例:
String 為Object子類 可以記為 String ≦ Object
但是:List<String> ls = new ArrayList<String>();
List<Object> t =ls; //Type mismatch: cannot convert from List<String> to List<Object>
即:f(String) 不是 f(Object) 子類
但可以引入引入萬用字元獲取類似效果
List<String> ls = new ArrayList<String>();
List<? extends Object> lo =ls; //協變
List<Object> obj_list = new ArrayList<Object>();
List<? super String> obj_s = obj_list; //逆變
陣列具有協變
String 為A String[] 為f(A)
String[] sts = {"1","2"};
Object[] objs = sts;