我見過很多的情況,在?類型僅用於創建引用。而且我們無法添加除null以外的任何對象。那麼,使用'?',只能創建引用?無界通配符類型僅用於創建引用嗎?
此外,什麼是需要/使用給選項添加一個null?他們可以簡單地使用add()方法實現,對吧?給列表<添加null選項的任何理由? >?
我見過很多的情況,在?類型僅用於創建引用。而且我們無法添加除null以外的任何對象。那麼,使用'?',只能創建引用?無界通配符類型僅用於創建引用嗎?
此外,什麼是需要/使用給選項添加一個null?他們可以簡單地使用add()方法實現,對吧?給列表<添加null選項的任何理由? >?
列表是一個通用的接口,和相同的接口,無論通用類型。因此,所有實現者都需要重新定義其中的所有方法。至於能夠將null添加到「無界」列表中,它不像關於界面的要求那麼多:
未綁定的通用通配符允許引用List(或其他泛型類)傳遞給方法,而不需要編譯時知道它將包含的特定類型。但是,通用合同仍必須得到尊重。這對讀操作沒有什麼大問題,因爲無論在List中,它總是(也)是一個java.lang.Object。另一方面,插入操作幾乎是不可能的,因爲缺少關於可接受類型的信息,不能接受類型 - 例如,一個列表只能接受字符串,但對象可能是其他任何東西 - 例如數字,因此不能安全接受。
空工程安全,因爲(假設列表接受空值),這將是總是有效的名單裏面放的唯一值(空可以轉換爲任何有效的類型)。
編輯:只是因爲我發現我其實並沒有回答你的問題:是的,定義引用時<?>
通配符(和擴展的形式,以及<? extends X>
和<? super X>
纔有效,並且不能在泛型實例中使用。
首先,null
是所有類型中的一員,這是語言規範的一部分預日期的仿製藥,所以你可以「做一下的事情。
至於使用的?
,你可以」 t *實例化*通配類型的通用類s,你不能這樣做:
List<? extends Number> list = new ArrayList<? extends Number>(); // error
因爲它沒有意義。通配符類型用於告訴編譯器「我不知道列表的類型是什麼,但它將受限於Number
」。但是,當代碼執行時,一個類型爲Number
的列表將被分配給該變量。
通配符是最經常被視爲參數:
public static void doSeomthing(List<? extends Number> list) {
// use the list knowing only that the elements are a subclass of Number
// but knowing which exact class they are
}