作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个签名
<T>IInterface<T> method(Class<T> myClass)
是否可以编写枚举来保存类类型以便能够将实例传递给方法?
method(MyEnum.STEP)
STEP 是一个类。
其实我想改变方法的签名来传递不Class<T> myClass
但枚举。但是我不想修改返回值类型 <T>IInterface<T>
.
<T>IInterface<T> method(MyEnum type)
最佳答案
枚举常量的值总是一个对象,它是枚举类的一个实例。你不能让它有不同的值(value);既不是对类的引用,也不是任何其他内容。
您可以在您的枚举上添加实例字段,它可以为每个枚举常量保存您想要的任何值:
enum MyEnum {
STEP(Step.class),
FOO(Foo.class),
BAR(Bar.class);
public final Class<?> klass;
private MyEnum(Class<?> klass) {
this.klass = klass;
}
}
(使用变量名 klass
因为 class
是保留关键字)。
您可以通过以下方式调用它:
method(MyEnum.STEP.klass);
但是,它不保留通用类型信息。 klass
字段类型为 Class<?>
对于每个枚举常量,method(MyEnum.STEP.klass)
的返回类型将是 IInterface<?>
而不是 IInterface<Step>
.
枚举不能是通用的,因此它们的字段对于不同的常量不能有不同的类型。如果您需要在常量中保留泛型类型信息,您将不得不为此放弃使用枚举,而是用一个类来伪造它。然后你可以用不同的类型声明每个常量:
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() {}
}
这将为您提供几乎完全符合您要求的方法签名:
<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;
}
}
关于java - 如何制作一个可以容纳 Class<T> 的通用枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27688267/
我是一名优秀的程序员,十分优秀!