簡體   English   中英

如果其中一個邊界是類,則必須首先在java泛型中指定它。 為什么?

[英]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而列出接口。

JLS # 4.4. Type Variables

聲明為類型參數的每個類型變量都有一個綁定。 如果沒有為類型變量聲明綁定,則假定為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.

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