泛型通配符使用指南
學習使用泛型編程時更困惑的一個方面是確定何時使用上界通配符以及何時使用下界通配符,此頁面提供了設計代碼時要遵循的一些準則。
對于本文的討論,將變量看作提供的兩個功能之一是有幫助的:
一個“In”變量
“in”變量向代碼提供數據,想象一下帶有兩個參數的復制方法:copy(src, dest),src參數提供要復制的數據,因此它是“in”參數。
一個“Out”變量
“out”變量保存數據以供其他地方使用,在復制示例中,copy(src, dest),dest參數接受數據,因此它是“out”參數。
當然,一些變量既用于“in”又用于“out”目的 — 該場景也在指南中解決。
在決定是否使用通配符以及適合使用哪種類型的通配符時,可以使用“in”和“out”原則,以下列表提供了遵循的準則:
使用extends關鍵字定義帶有上界通配符的“in”變量。
使用super關鍵字定義帶有下界通配符的“out”變量。
在可以使用Object類中定義的方法訪問“in”變量的情況下,使用無界通配符。
在代碼需要作為“in”和“out”變量訪問變量的情況下,不要使用通配符。
這些指南不適用于方法的返回類型,應該避免使用通配符作為返回類型,因為它強制程序員使用代碼來處理通配符。
由List extends ...>定義的列表可以非正式地認為是只讀的,但這不是一個嚴格的保證,假設你有以下兩個類:
class NaturalNumber { private int i; public NaturalNumber(int i) { this.i = i; } // ... } class EvenNumber extends NaturalNumber { public EvenNumber(int i) { super(i); } // ... }
考慮以下代碼:
Listle = new ArrayList<>(); List extends NaturalNumber> ln = le; ln.add(new NaturalNumber(35)); // compile-time error
因為List
你可以添加null。
你可以調用clear。
你可以獲取迭代器并調用remove。
你可以捕獲通配符并寫入從列表中讀取的元素。
你可以看到List extends NaturalNumber>定義的列表在嚴格意義上不是只讀的,但你可能會這樣想,因為你無法存儲新元素或更改列表中的現有元素。
上一篇:泛型通配符捕獲和Helper方法 下一篇:類型擦除文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72941.html
Java? 教程 Java教程是為JDK 8編寫的,本頁面中描述的示例和實踐沒有利用在后續版本中引入的改進。 Java教程是希望使用Java編程語言創建應用程序的程序員的實用指南,其中包括數百個完整的工作示例和數十個課程,相關課程組被組織成教程。 覆蓋基礎知識的路徑 這些教程以書籍的形式提供,如Java教程,第六版,前往Amazon.com購買。 入門 介紹Java技術和安裝Java開發軟件并使用...
泛型通配符 在泛型代碼中,稱為通配符的問號(?)表示未知類型,通配符可用于各種情況:作為參數、字段或局部變量的類型,有時作為返回類型(盡管更好的編程實踐是更加具體),通配符從不用作泛型方法調用、泛型類實例創建或超類型的類型參數。 以下部分更詳細地討論通配符,包括上界通配符、下界通配符和通配符捕獲。 上界通配符 你可以使用上界通配符來放寬對變量的限制,例如,假設你要編寫一個適用于List、List和...
泛型通配符捕獲和Helper方法 在某些情況下,編譯器會推斷出通配符的類型,例如,列表可以定義為List,但是在評估表達式時,編譯器會從代碼中推斷出特定類型,此場景稱為通配符捕獲。 在大多數情況下,你不必擔心通配符捕獲,除非你看到包含短語capture of的錯誤消息。 WildcardError示例在編譯時產生捕獲錯誤: import java.util.List; public class ...
泛型的限制 要有效地使用Java泛型,必須考慮以下限制: 無法使用基元類型實例化泛型類型 無法創建類型參數的實例 無法聲明類型為類型參數的靜態字段 無法對參數化類型使用強制類型轉換或instanceof 無法創建參數化類型的數組 無法創建、捕獲或拋出參數化類型的對象 無法重載將每個重載的形式參數類型擦除為相同原始類型的方法 無法使用基元類型實例化泛型類型 考慮以下參數化類型: class P...
泛型、繼承和子類型 如你所知,只要類型兼容,就可以將一種類型的對象分配給另一種類型的對象,例如,你可以將Integer分配給Object,因為Object是Integer的超類型之一: Object someObject = new Object(); Integer someInteger = new Integer(10); someObject = someInteger; // OK ...
閱讀 1599·2021-11-22 09:34
閱讀 1690·2019-08-29 16:36
閱讀 2668·2019-08-29 15:43
閱讀 3113·2019-08-29 13:57
閱讀 1297·2019-08-28 18:05
閱讀 1874·2019-08-26 18:26
閱讀 3242·2019-08-26 10:39
閱讀 3454·2019-08-23 18:40