[英]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.