如何处理Java中的通用枚举?

Jor*_*dan 2 java generics enums

所以,我有一个抽象类,如:

public abstract class AbstractParent <E extends Enum<E>> {...}
Run Code Online (Sandbox Code Playgroud)

在AbstractParent里面的非抽象方法的某处,我想迭代E的值.这可能吗?

更好的例子:

public abstract class AbstractParent <E extends Enum<E>> {
    ...
    protected void doSomething() {
        //iterate over the values of E and perform an action using them
    }
}

public class Child extends AbstractParent<Child.Index> {
    public static enum Index {
        ...
    }
    public Child() {
        super();
        this.doSomething(); //this should iterate over Index's values
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

所以,感谢mdma,这非常有效:

public abstract class AbstractParent <E extends Enum<E>> {
    ...
    protected void doSomething() {
        //iterate over the values of E and perform an action using them
        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
        Type t = pt.getActualTypeArguments()[0];
        E[] enumValues = ((Class<E>)t).getEnumConstants();
        // enumValues is now an iterable array of the values inside Index
    }
}

public class Child extends AbstractParent<Child.Index> {
    public static enum Index {
        ...
    }
    public Child() {
        super();
        this.doSomething(); //this should iterate over Index's values
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢LOADS对mdma,你应该得到比我能给的更多的积分.

mdm*_*dma 5

EDIT2:超类和接口上的泛型不会被删除.您可以在运行时获取泛型类型,并使用它来获取枚举值.请参见Class.getGenericSuperclass.这将节省您必须在构造函数中传递值或类.

原文:你不能用泛型来做这件事.但是,如果你也传入相应的类,例如构造函数

AbstractParent(Class<E> enumClass)
{
   this.enumClass = enumClass;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它来获取相应的枚举值

public E[] getValues()
{
    return this.enumClass.getEnumConstants();
}
Run Code Online (Sandbox Code Playgroud)

编辑:虽然客户端不是专业程序员,但编译器将确保传递正确的类.您还可以通过提供示例和单元测试来明确使用.

您还可以获取Enum的构造函数和实际值,并从中派生类.这可能更容易使用,因为参数是一个E而不是更"可怕" Class<E>.

例如

AbstractParent(E enumValue)
{
   this.enumClass = enumValue.getClass();
}
Run Code Online (Sandbox Code Playgroud)