gpt4 book ai didi

java - 如何制作一个可以容纳 Class 的通用枚举?

转载 作者:行者123 更新时间:2023-12-03 23:17:06 25 4
gpt4 key购买 nike

假设我有一个签名

<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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com