[英]Is it possible to extend the generic type to multiple classes in Java?
我試圖在Java中編寫一個使用泛型參數的方法,我想將其限制為三個可能的類之一( Field
, Method
或Constructor
)。
我試過以下標題:
private static <T extends Field,Method,Constructor> T[] sort(T[] anArray)
但是這樣它會忽略Method
或Constructor
類型的泛型參數。 使用以下內容也會產生錯誤:
private static <T extends Field | Method | Constructor> T[] sort(T[] anArray)
是否有可能在Java
做這樣的事情?
對於您的特定情況(如果您正在討論反射特定類),您很幸運。
您可以使用AccessibleObject
類。
private static <T extends AccessibleObject> T[] sort(T[] anArray)
您可能還對Member
界面感興趣,具體取決於您的要求。
無法使用或運算符( |
)定義類型參數綁定。
但是,只能通過使用&
運算符來限制類型參數T
以擴展類和多個接口:
<T extends SomeClass & FirstInterface & SecondInterface>
不,但您可以使用通用接口/超類,只需使用Object
並檢查方法內部或提供單獨的重載。
請注意, A & B
是可能的,即要求泛型類型實現這兩種類型。 你不能使用或 (即A | B
),因為編譯器不能/不會確定一個常見的超類型 - 如果它甚至存在於Object
之外 - 因此你的實現不能在任何類型上工作,因為當有疑問你會被錯誤的類型通過。
想一想:如果你被允許宣布T
為T extends Field | Method
T extends Field | Method
,你會如何在代碼中使用它? 你真正知道的是兩種類型都提供了Object
的方法。
泛型旨在消除(可能失敗的)強制轉換的需要,以便訪問特定類型的方法(即泛型類型的上限)。 限制參數類型就是這樣的結果,但並不是您希望使用它的主要目標。 這就是重載的方法。
編輯:我剛剛閱讀了Codebender的答案,這就是我在第一句話中提到的:使用一個通用界面,或者就像這里的情況一樣,使用超級類。 這可能是最好的方式。
Field
, Constructor
和Method
均繼承自Member
。 你可以這樣做:
private static <T extends Member> T[] sort(T[] anArray)
指定一個可以匹配幾個不相關類型之一的類型綁定是沒有意義的。 泛型的全部意義在於為編譯器提供足夠的信息來確定哪種方法可用於類型T
因為我們不確切知道T
究竟是什么。 如果它可以是三件事之一,編譯器怎么可能知道應該允許哪些方法?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.