2013-10-11 33 views
1

代碼:通配符,它​​是如何工作的?

List<? extends Integer> ints= new ArrayList<Integer>(); 
ints.add(3);//error 

我仍然不明白它是如何工作的。 問題:

是什麼意思CAP#1?它是參考類型嗎?我認爲,不,因爲CAP#1不從Object繼承。我們可以寫ints.add(null);//OK並且我們沒有編譯時錯誤。但我們不能寫null instanceof CAP#1;//compile-time error。爲什麼我們不能實例化CAP#1

CAP#1 c= new CAP#1(); 

CAP#1看到了什麼?

+0

[無法將一個ModuleInfo對象添加到ArrayList <?擴展ModuleInfo>](http://stackoverflow.com/questions/13499928/cant-add-a-moduleinfo-object-to-arraylist-extends-moduleinfo) –

+0

@Rohit Jain我有以下問題:編譯器是否知道方法'布爾添加(?擴展整數)'參數的類型'?擴展了由「CAP#1」定義的Integer,其中CAP#1在這種情況下是一種特殊類型,可能只有一個實例 - null?這個問題是否正確?如果正確,請回答。 –

回答

4

CAP#1是編譯器的由「?」所代表的隱式類型變量名。沒有這種命名類型,但編譯器需要爲該類型創建一個佔位符以完成其工作。該名稱代表「捕獲」。

它有助於精神上重寫一個類型如G<? extends T>∃CAP#1 extends T: G< CAP#1 >

由於不知道通配符代表什麼,因此不能使用通配符擴展類型將任何內容添加到列表中。就像您不能將Snake添加到List<Mammal>一樣,您無法將其添加到List< ? extends Animal >,因爲該?可能代表Mammal

你可以,但是,總是在這種情況下添加null因爲null是有效每個引用類型,其中必然包括無論?可能可能代表中的一員。

我經常想知道爲什麼Java不會將List< ? extends F >作爲最終類型FList<F>相同。也許這是因爲F本身可能是一個通用的通配符類型,這意味着它仍然會有任意多的子類型。

除了Angelika Langer着名的關於Java泛型的常見問題,我一直在編輯關於他們的some things在我自己的列表中。

+0

_CAP#1是由'?'表示的隱式類型變量的編譯器名稱_什麼意思是隱式類型?編譯器是否知道對於所有隱式類型,我們只有一個這樣的實例?它是'空'。我認爲,這不是事實。因爲如果我們考慮使用'super'的通配符,我們也有隱式類型:'List <? super Integer> ints = new ArrayList (); ints.add(「dsd」); //編譯錯誤整數。add(4); // ok' –

+0

你應該總是閱讀一個通配符類型,比如'G 'as&exists; 'S擴展T:G < S >'。關於編譯器w.r.t的行爲超級,查找「PECS」(製片人延伸,超級消費者)。 –

+0

'∃CAP#'n'延伸T:G < CAP#'n '>' –

相關問題