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