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