1. 程式人生 > >泛型 協變 逆變 java

泛型 協變 逆變 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;