[英]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;
}
SomeValue1
和SomeValue2
類實現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.