簡體   English   中英

為什么我不能使用帶通配符的多個類型參數?

[英]Why can't I use multiple type parameters with a wildcard?

例如:為什么我不能這樣做(I1和I2是兩個接口):

 List<? extends I1 & I2> myList;

請注意,我不希望添加一個擴展I1和I2的新接口,因為它沒有任何附加功能,並且只是一個占位符

兩個原因:

第一個是因為Java不支持多重繼承。

第二個是因為這意味着您無法返回具有多種類型的對象。

例如,想象一下myList.get(i)方法。 您的示例中應該具有哪種返回類型? 它必須是I1或I2,它不能兩者兼而有之。

您可以定義一個實現I1和I2的接口,然后使用它 - 但是添加到列表中的所有對象都需要實現新接口。 添加實現I1和I2但不是新接口的東西仍然無效。

忘記泛型並嘗試編寫返回I1和I2的.get()的方法存根 - 你不能這樣做,它在Java中是不合法的。 泛型不允許你這樣做,因為沒有辦法將生成的代碼轉換為合法的Java代碼。 有關為什么Java僅支持單繼承的更詳細討論,因為它是更大討論的一部分。

Java不支持它。 你可以通過定義一個將由I1I2擴展的interface I3來實現這一點

您可以定義自己的新接口,以獲得相同的結果:

interface ABList<T extends A & B> extends List<T> {

}

....
ABList<X> abList = ...;

您必須記住,泛型不是嘗試擴展現有的Java參數匹配系統。 它更像是一種收緊編譯時參數檢查的方法,在這種情況下,您通常會嘗試在運行時進行轉換,並冒着類轉換異常的風險。 ? 在仿制葯中應該是非常罕見的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM