是的,就是這樣。爲了大家的緣故,這裏是完整的解釋。
這裏就是你們的榜樣的另一個版本(想象整型可擴展)
interface Intf<T extends Number> {}
class Clss<T extends Number> {}
class Impl<T extends Integer> implements Intf<T> {}
class Subc<T extends Integer> extends Clss<T> {}
class ImplSubc<T extends Integer> extends Clss<T> implements Intf<T> {}
的<T extends Integer>
是初始化標籤,以及進一步<T>
標籤基本上都是「傳遞下去」的引用。這兩個標籤在視覺上是相同的,但它們是不同的東西。由於沿標記通需要別的東西來初始化請注意以下內容是非法的
class Subc<T extends Integer> extends Clss<T extends Integer> {}
。所以你可以知道哪些是因爲initialize標籤最終會傳遞給它,而傳遞標籤是根據初始化標籤設置的內容傳遞(或返回)的東西。所以,如果你只有以下幾種:
class Subc<T> extends Clss<T> {}
編譯單元說:「允許它被設置爲任何東西,並將其傳遞給Clss」。由於您可以將初始化標記傳遞給多個傳遞標記,每個傳遞標記都可能具有不同的邊界,因此需要明確設置初始化標記NEEDS以確保傳遞的<T>
確實與您傳遞的所有內容都兼容。雖然這在技術上可以推斷出來,但它昂貴,複雜,並要求可怕的生產破壞錯誤,所以編譯器只會迫使你知道你在做什麼。
更新:
這裏是一個例子,說明如果讓編譯器決定你的代碼是什麼,一個bug如何進入生產。假設編譯器並推斷限制,如果
class Clss<T extends Number> {}
class Subc<T> extends Clss<T> {}
成爲
class Clss<T extends BigDecimal> {}
class Subc<T> extends Clss<T> {}
沒有extends Integer
集上SUBC,讓它可以推斷,這種變化將彙編(如果這是根據在什麼使用它作爲一個獨立的API),並且可能仍然在工作,直到它沒有。因爲你說你明確想要使用Integer或Number,所以現在可以在編譯時確定更改Clss的類型是安全的還是壞的更改,而不是運行時。 Java是安全第一類型語言,這意味着代碼穩定性/可靠性檢測是其特性的核心價值。所以如果有疑問,Java會抱怨。
不。有很多可能性可以進入'''',而不僅僅是'T'。儘管'T'是一個非常普遍的例子,但是建立某種類型的arg暗示的推理規則並不值得使語言複雜化;最好明確地說明你想要的內容。 – ZhongYu
作爲一個簡單的例子,如果你有'Impl實現Intf ??>',會發生什麼? –