Java 如何创建可容纳类的通用枚举<;T>;?

Java 如何创建可容纳类的通用枚举<;T>;?,java,generics,enums,core,Java,Generics,Enums,Core,假设我有签名 <T>IInterface<T> method(Class<T> myClass) STEP是一个类 实际上,我想更改方法的签名,使其传递的不是classmyclass,而是enum。但是我不想修改返回值类型IInterface i接口方法(MyEnum类型) 枚举常量的值始终是作为枚举类实例的对象。你不能让它有不同的价值;既不是对类的引用,也不是其他任何内容 您可以在枚举上添加实例字段,该字段可以保存每个枚举常量所需的任何值: enum My

假设我有签名

<T>IInterface<T> method(Class<T> myClass)
STEP是一个类

实际上,我想更改方法的签名,使其传递的不是
classmyclass
,而是enum。但是我不想修改返回值类型
IInterface

i接口方法(MyEnum类型)

枚举常量的值始终是作为枚举类实例的对象。你不能让它有不同的价值;既不是对类的引用,也不是其他任何内容

您可以在枚举上添加实例字段,该字段可以保存每个枚举常量所需的任何值:

enum MyEnum {
    STEP(Step.class),
    FOO(Foo.class),
    BAR(Bar.class);

    public final Class<?> klass;

    private MyEnum(Class<?> klass) {
        this.klass = klass;
    }
}
但是,它不保留泛型类型信息。对于每个枚举常量,
klass
字段的类型为
Class
,因此
方法(MyEnum.STEP.klass)
的返回类型将是
IInterface
而不是
IInterface

枚举不能是泛型的,因此它们的字段对于不同的常量不能有不同的类型。如果需要在常量中保留泛型类型信息,则必须放弃使用枚举来实现此目的,而是使用类来伪造它。然后可以使用不同的类型声明每个常量:

class MyConstant<T> {
    public static final MyConstant<Step> STEP = new MyConstant<>();
    public static final MyConstant<Foo> FOO = new MyConstant<>();
    public static final MyConstant<Bar> BAR = new MyConstant<>();

    private MyConstant() {}
}
类MyConstant{
公共静态最终MyConstant步骤=新建MyConstant();
public static final MyConstant FOO=new MyConstant();
public static final MyConstant BAR=new MyConstant();
私有MyConstant(){}
}
这将为您提供所需的几乎完全相同的方法签名:

<T> IInterface<T> method(MyConstant<T> type)
i接口方法(MyConstant类型)
它被调用为:

IInterface<Step> something = method(MyConstant.STEP);
IInterface something=method(MyConstant.STEP);
如果您还需要运行时可用的类型信息,可以将类值作为字段添加到常量中,方法与枚举示例相同:

class MyConstant<T> {
    public static final MyConstant<Step> STEP = new MyConstant<>(Step.class);
    public static final MyConstant<Foo> FOO = new MyConstant<>(Foo.class);
    public static final MyConstant<Bar> BAR = new MyConstant<>(Bar.class);

    public final Class<T> klass;

    private MyConstant(Class<T> klass) {
        this.klass = klass;
    }
}
类MyConstant{
public static final MyConstant STEP=新的MyConstant(STEP.class);
公共静态最终MyConstant FOO=新MyConstant(FOO.class);
公共静态最终MyConstant BAR=新MyConstant(BAR.class);
公开期末班klass;
私人MyConstant(klass类){
this.klass=klass;
}
}

它不起作用。必需:
IInterface
但发现:
IInterface
@barbara你是对的,我忽略了一个事实,即你需要使用enum常量来推断方法的返回类型。我现在编辑了我的答案。
<T> IInterface<T> method(MyConstant<T> type)
IInterface<Step> something = method(MyConstant.STEP);
class MyConstant<T> {
    public static final MyConstant<Step> STEP = new MyConstant<>(Step.class);
    public static final MyConstant<Foo> FOO = new MyConstant<>(Foo.class);
    public static final MyConstant<Bar> BAR = new MyConstant<>(Bar.class);

    public final Class<T> klass;

    private MyConstant(Class<T> klass) {
        this.klass = klass;
    }
}