Java萬用字元釋疑

2021-09-02 18:18:38 字數 1733 閱讀 4205

泛型萬用字元:

例子:inte***ce aa{}

class bb{}

class a1 extends bb implements aa{}

class b1 extends a1{}

list<? extends bb> list = new arraylist();

list<? extends bb> list0 = new arraylist();

list = list0;

解析:list.add(new a1())之所以報錯是因為不能確定list中的元素是什麼型別,雖然此時它的確指向的是new arraylist(),但編譯器還沒有智慧型到這種程度,知道list當前的元素型別。

list<? extends bb>只是一種引用宣告,宣告引用的list中的元素型別是繼承bb的,但並不確定是何種型別(capture#1-of ? extends bb),所以list = list0並不會報錯,

因為list和list0當中的元素都是繼承bb的,符合(capture#1-of ? extends bb)的定義宣告

list<? super b1> list2 = new arraylist();

list<? super a1> list3 = new arraylist();

//list3 = list2; //編譯報錯 type mismatch: cannot convert from listto list<? super a1>

list2 = list3;

解析:list2不能新增a1型別元素,因為a1是b1的父類,而list3可以新增a1型別元素,因此將list2賦給list3不正確。(add只能add與super同等級的或者為該等級子類的型別,儘管b1的直接超類就是a1,也不能新增a1類元素,只能認為編譯器認為b1有可能實現不同的介面,譬如i1,單i1跟a1是沒有繼承關係的,所以如果集合是i1型別,那新增a1型別的元素肯定是錯的)

list2=list3似乎有些彆扭,因為list2的元素型別是super b1,即它可能是a1,而list3的元素型別是super a1,即它可能是bb,而將list3賦給list2似乎是將父類元素bb強轉為a1,

這應該是報錯才對,但我們要回到之前討論的list<? super b1> 的意義是什麼,它只是一種引用宣告,宣告引用的list的元素型別是super b1的(capture#1-of ? super b1),

至於是什麼型別並不確定,它可以動態指向任何元素型別super a1的list。以下賦值宣告也正確:

list<? super b1> list4 = new arraylist(); //bb是b1的祖輩元素

list<? super b1> list2 = new arraylist();

解析:list2的元素實體明明是用了裝a1型別的,但新增a1卻報錯,這是因為list<? super b1>也可能指向new arraylist(),此時直接新增父類元素a1當然報錯了

總結:1.list<? super aa> list2 = new arraylist();//list<? super aa> list2 = new arraylist();這個宣告會報錯

2.list2.add(new b1());

1和2要的時機是不同的,1是宣告,2是往堆記憶體新增實際物件。

宣告時建立的集合泛型型別要直接符合萬用字元的父子宣告;

新增時看是否會存在一種符合萬用字元的型別a(不用看實際指向的堆記憶體存的是什麼型別的資料),新增的元素型別與型別a不相容,若無則可新增該型別元素。

Java 萬用字元

考慮編寫列印出集合中所有元素的例程的問題。以下是您可以在舊版本的語言中編寫它 即5.0之前的版本 voidprintcollection collection c 問題是這個新版本比舊版本更有用。雖然可以使用任何型別的集合作為引數呼叫舊 但新 僅採用collection,正如我們剛才演示的那樣,它不...

Java 萬用字元 學習

參考連線1 參考連線2 泛型的一種延伸,擴充套件.型別上界,表示引數化型別的可能是t 或是 t的子類 型別下界,表示引數化型別是此型別的超型別 父型別 直至object list list1 getfatherlist 借用參考鏈結裡面的例子 list1不能新增任何元素.只能取,list list ...

java萬用字元 隨筆

public class tongpeifu static void unboundedarg holder holder object arg static t exact1 holderholder static t exact2 holderholder,t arg static t wild...