[英]If one of the bounds is a class, it must be specified first in java generics. Why?
我指的是這個java文檔 。 如果其中一個邊界是類,則必須首先指定它 。 我覺得應該允許任何順序。
為什么java有這樣的限制? 這背后有什么具體原因嗎?
多個邊界
前面的示例說明了使用帶有單個邊界的類型參數,但是類型參數可以有多個邊界:
具有多個邊界的類型變量是綁定中列出的所有類型的子類型。 如果其中一個邊界是類,則必須首先指定它。 例如:
Class A { /* ... */ }
interface B { /* ... */ }
interface C { /* ...
*/ }
class D <T extends A & B & C> { /* ... */ }
如果未首先指定綁定A,則會出現編譯時錯誤:
class D <T extends B & A & C> { /* ... */ } // compile-time error ,but why ?
首先,那里只能有一個班級; 每個Java類( java.lang.Object
除外,這是一個特殊情況作為層次結構的根)只能從一個其他類繼承。 可以有多個接口,但最多只有一個類。 這極大地簡化了類型層次結構和對象構造過程的處理。
鑒於此,語言設計者決定必須首先在類中列出類(如果它存在的話)。 實際上沒有深層次的理由 - 編譯器可以在沒有排序的情況下強制執行唯一的一類限制 - 但它確實使教學更容易,因為有一個簡單的規則: 如果你正在使用一個類作為泛型類型綁定,把它放在第一位 。
他們可能只是將接口分組在一起,與類分開。
如果T
是一個類,那么它看起來如下:
public class T extends A implements B, C {
但是在泛型中沒有implements
,只能extends
。 因此,約束可能只是讓我們首先列出類本身,然后由於缺少關鍵字implements
而列出接口。
聲明為類型參數的每個類型變量都有一個綁定。 如果沒有為類型變量聲明綁定,則假定為Object。 如果聲明了綁定,則它包含:
T
,或 T
可能后跟接口類型I1 & ... & In
我會說"A type variable with multiple bounds is a subtype of all the types listed in the bound."
並且似乎Java要求您在類聲明中指出extends First,這是原因。 (另一方面,一個類只能擴展另一個類)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.