java - 使用枚举作为我的类的通用类型但无法创建实例

标签 java generics enums

我有枚举:

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类型作为泛型类型吗?如果是这样,是否有解决方法可以实现我想要实现的目标?

最佳答案

Is it because Java don't accept enum type as generic type?

任何枚举类型都是有效类型,并且可以参与形成类型参数(例如 MyClass<T extends MyTypes> )和参数化类型(例如 MyClass<MyTypes> myInstance )。

你做了什么

MyClass<FOO> myInstanceWithFoo = new MyClass();

FOO 以来从未正确过是 MyTypes 的实例(或对象) 。它不是一种类型,也不能被视为一种类型。

If so, is there a workaround to achieve what I want to achieve?

不需要MyClass是通用的。它声明了 MyTypes字段可以是 MyTypes.FOOMyTypes.BAR (或者 null ,当然)。

class MyClass {
  private MyTypes myType;

  public MyClass(MyTypes myType) {
    this.myType = myType;
  }
}

每个MyTypes实例知道如何创建 MyClass来自自身。

enum MyTypes {
  FOO, BAR;

  public MyClass createMyClass() {
    return new MyClass(this);
  }
}

如何创建它们的示例是

class Example {
  public static void main(String[] args) {
    MyClass myInstanceWithFoo = MyTypes.FOO.createMyClass();
    MyClass myInstanceWithBar = MyTypes.BAR.createMyClass();
  }
}

关于java - 使用枚举作为我的类的通用类型但无法创建实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58208761/

相关文章:

java - file.getAbsolutePath() 和 file.length() 返回错误值

java - 如何让 Maven 编译一个使用 com.apple.eawt.Application 的 .java 文件

java - 如何在 Java 中编写泛型方法以支持比较和算术运算

java - pig - 我得到 "Error: Java heap space"和数十万元组

java - 尝试获取两个时间戳,减去它们,将差值转换为秒并存储在 int 变量中

.net - 为什么没有 HybridDictionary 的通用版本?

swift - 在 Swift 中创建没有外部属性的结构/协议(protocol)/类

java - 为什么在枚举类中阻止默认序列化

swift - 这段 Swift 代码中发生了什么

c# - 如何找出整数值中哪些枚举项是 "hidden"