簡體   English   中英

具有通用屬性的 Java 枚舉

[英]Java enum with generic attributes

我一直在嘗試創建包含通用屬性的枚舉,例如:

public enum SomeEnum {
    SOME_VALUE_1(SomeValue1.class),
    SOME_VALUE_2(SomeValue2.class);

    private final Class<T extends SomeValue> className;
}

SomeValue1SomeValue2類實現SomeValue接口。 出於某種原因, <T extends SomeValue>被標記為“意外綁定”錯誤。 如果我將T替換為? ,沒有錯誤。 但它仍然讓我感到困惑,為什么當我使用T時會發生這種情況。

任何幫助將不勝感激。

當您以這種方式使用T extends SomeValue時,您正在引用一個未定義的類型變量T ,並且不允許您在那里定義一個類型變量。 只有在類型變量聲明中,您才允許定義諸如T extends SomeValue之類的界限。

在接口或 class 上,您可以使用所需的邊界定義T ,但不能在enum上定義。 在 Java 中不允許枚舉是通用的。

您可能在未顯示的構造函數上遇到相同的錯誤,該構造函數接受Class<T extends SomeValue>分配給className 同樣的原因在這里也適用。

使用? extends SomeValue ? extends SomeValue是一個上限通配符。 它基本上意味着“一種特定但未知的類型,即SomeValue或子類型”。 這在這里是合適的,因為您在這里關心的是Class用於SomeValue或某些實現 class。

<? extends SomeClass> <? extends SomeClass><T extends SomeClass>是兩種截然不同的語法。

第一個是通配符綁定,是類型參數的一部分:

TypeArguments:
  < TypeArgumentList >
TypeArgumentList:
  TypeArgument {, TypeArgument}
TypeArgument:
  ReferenceType 
  Wildcard
Wildcard:
  {Annotation} ? [WildcardBounds]
WildcardBounds:
  extends ReferenceType 
  super ReferenceType

第二個是類型綁定類型參數的一部分:

TypeParameter:
  {TypeParameterModifier} Identifier [TypeBound]
TypeParameterModifier:
  Annotation
TypeBound:
  extends TypeVariable 
  extends ClassOrInterfaceType {AdditionalBound}

類型參數和類型參數有什么區別? 類型參數,如方法參數,出現在例如泛型類/方法聲明中:

class Foo<T extends SomeClass> {} // "T extends SomeClass" is a type parameter
class Bar<T> {} // "T" is a type parameter

這類似於方法參數:

void foo(int i) {} // "int i" is a method parameter

類型參數,如方法參數,出現在您使用泛型類/方法的地方。 例如,在字段聲明中:

Foo<? extends SomeClass> foo; // "? extends SomeClass" is a type argument
Bar<String> // "String" is a type argument

這類似於調用方法時傳遞的方法 arguments:

foo(1); // "1" is a method argument

所以真的,使用T extends SomeClass你應該在哪里使用? extends SomeClass ? extends SomeClass沒有意義。 您沒有在這里聲明一個新的類型變量。 您只是在構造一個泛型類型。

暫無
暫無

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

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