[英]Why doesn't the compiler infer T(interface) to be class that implements T when having double bounded generic type?
我有一個實現兩個接口 IBound1 和 Ibound2 的 class CBound:
class CBound implements IBound1, IBound2 {}
我有一個通用方法,它接受實現 IBound1 和 Ibound2 接口的 class 類型作為類型參數:
public static <T extends IBound1 & IBound2> void getData(T list) {
//Some code...
}
我使用 CBound class 實現了 IBound1 類型的 object:
IBound1 a = new CBound();
getData(a); // doesn't work
為什么 obj a 不能作為 getData() 的參數?
當我更改代碼時:
CBound b = new CBound();
getData(b); // It works fine
編譯器必須在編譯時推斷出滿足界限的T
當你傳入a
時,編譯器只知道a
的類型是IBound1
。 由於該方法的參數也是T
,因此編譯器實際上只有兩個T
選擇 - IBound1
或Object
- 兩者都不滿足邊界。
你可能會問,“那為什么編譯器不推斷T
是CBound
呢?” 好吧,表達式getData(a)
中沒有任何CBound
類型的內容。 即使我們通過閱讀前面的代碼行知道a
實際上是指 CBound 類型的CBound
,但編譯器在推斷T
時不會考慮這一點。 即使T
被推斷為CBound
,您也無法將a
傳遞給CBound
類型的參數。
但是,在b
的情況下,編譯器非常清楚b
是CBound
類型(因為您已經聲明了它),因此它可以成功地將T
推斷為CBound
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.