簡體   English   中英

為什么編譯器不推斷 T(interface) 是 class 在具有雙界泛型類型時實現 T ?

[英]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選擇 - IBound1Object - 兩者都不滿足邊界。

你可能會問,“那為什么編譯器不推斷TCBound呢?” 好吧,表達式getData(a)中沒有任何CBound類型的內容。 即使我們通過閱讀前面的代碼行知道a實際上是指 CBound 類型的CBound ,但編譯器在推斷T時不會考慮這一點。 即使T被推斷為CBound ,您也無法將a傳遞給CBound類型的參數。

但是,在b的情況下,編譯器非常清楚bCBound類型(因為您已經聲明了它),因此它可以成功地將T推斷為CBound

暫無
暫無

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

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