我曾問過類似的問題,這是在得到一個明確的答案,希望更具體的版本。 「?」 雖然試圖瞭解java泛型類型和外卡的使用,我試過如下:瞭解在java泛型中使用通配符?
List<Integer> li4 = new ArrayList<Integer>();
li4.add(new Integer(5));
Integer myInt4 = li4.get(0);
現在我更換了更通用型「
List<? extends Integer> li = new ArrayList<Integer>();
Integer myInt = li.get(0);
以上編譯罰款。 似乎上述被處理作爲一個列表,其中每個元素是一個整數「禮」(看li.get(0)調用)。 我也可以做到以下幾點:
li = li4;
以上編譯運行正常。 但當我嘗試:
li.add(new Integer(5));
我獲得以下編譯錯誤(使用Oracle JDeveloper作爲IDE):
Error(24,9): cannot find method add(java.lang.Integer)
「?擴展Integer'應該允許擴展Integer的任何類型。它的行爲與'get'方法相同,它返回一個Integer。同樣,它不會在ArrayList分配給它時發生抱怨。因此,例如'li = new ArrayList<String>()'
不能編譯。那麼,爲什麼我允許指定另一個ArrayList<Integer>()
,得到一個整數回去,但不能添加整數?
您提到「對於擴展Integer的某些特定T」。如果該特定的T擴展整數比'T'至少必須具有整數中找到的行爲。 – 2014-09-25 19:58:42
這是真的,但它可能有更多的行爲。所以,如果你嘗試在列表中添加_just_一個簡單的'Integer'?擴展Integer>',它可能不具有它應該具有的所有行爲。 – 2014-09-25 21:19:49