java使用enum作为类的泛型类型,但未能创建实例
我有:
public enum MyTypes {FOO, BAR}
我用泛型类型定义了一个类:
public MyClass<T extends MyTypes> {
private T theType;
...
}
以上代码编译成功
接下来,我尝试创建MyClass的一个实例,使用类型Foo作为泛型参数:
// Compilation error: Cannot resolve symbol FOO
MyClass<FOO> myInstanceWithFoo = new MyClass();
是因为Java不接受enum
类型作为泛型类型吗?如果是的话,是否有一个变通方法来实现我想要实现的目标
# 1 楼答案
我猜你把FOO当成了MyClass的子类型,而实际上它是一个实例
使用“普通”泛型,可以指定占位符的类型:
它被实例化了
GenericClass<String> gen = new GenericClass<>(); // String is a subclass of Object
然后将其编译为
请注意,字符串没有值。没有字符串实例。 为此,我们需要一个setter或构造函数:
或者
因此,对于作为泛型类型的枚举,我们要说明的类型是MyType。值应该是FOO,所以我们同样需要setter或构造函数:
为了确保我们有一个FOO实例,我们将其传递给构造函数
希望这有意义
# 2 楼答案
任何枚举类型都是有效的类型,可以参与形成类型参数(例如
MyClass<T extends MyTypes>
)和参数化类型(例如MyClass<MyTypes> myInstance
)你做了什么
永远不正确,因为
FOO
是MyTypes
的实例(或对象)。它不是一种类型,不能被视为一种类型不需要
MyClass
是通用的。它声明了一个MyTypes
字段,可以是MyTypes.FOO
或MyTypes.BAR
(当然也可以是null
)每个
MyTypes
实例都知道如何从自身创建MyClass
如何创建它们的一个例子是