有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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类型作为泛型类型吗?如果是的话,是否有一个变通方法来实现我想要实现的目标


共 (2) 个答案

  1. # 1 楼答案

    我猜你把FOO当成了MyClass的子类型,而实际上它是一个实例

    使用“普通”泛型,可以指定占位符的类型:

    public class GenericClass <T extends Object> { // a bit contrived here
        private T generic;
    }
    

    它被实例化了

    GenericClass<String> gen = new GenericClass<>(); // String is a subclass of Object

    然后将其编译为

    public class GenericClass {
       private String generic;
    }
    

    请注意,字符串没有值。没有字符串实例。 为此,我们需要一个setter或构造函数:

    public class GenericClass<T extends Object> {
        private T generic;
    
        public GenericClass(T generic) {
            this.generic = generic;
        }
    
    }
    
    GenericClass<String> gen = new GenericClass<>("Passing in a String because T was a String");
    

    或者

    GenericClass<Integer> gen2 = new GenericClass<>(2); // T is integer so we can only pass integers - 2 will be the instance.
    

    因此,对于作为泛型类型的枚举,我们要说明的类型是MyType。值应该是FOO,所以我们同样需要setter或构造函数:

    public class MyClass<T extends MyTypes> {
        private T theType;
    
        public MyClass(T theType) {
            this.theType = theType;
        }
    
    }
    

    为了确保我们有一个FOO实例,我们将其传递给构造函数

    MyClass<MyTypes> myInstanceWithFoo = new MyClass<>(MyTypes.FOO);
    

    希望这有意义

  2. # 2 楼答案

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

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

    你做了什么

    MyClass<FOO> myInstanceWithFoo = new MyClass();
    

    永远不正确,因为FOOMyTypes的实例(或对象)。它不是一种类型,不能被视为一种类型

    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();
      }
    }