gpt4 book ai didi

java - 正确地转换泛型

转载 作者:搜寻专家 更新时间:2023-11-01 03:51:33 24 4
gpt4 key购买 nike

我怎么投 Class<? extends Enum<?>>Class<T> , 其中<T extends Enum<T>> ?具体来说,我需要传递 Class<? extends Enum<?>> 的一个实例到 Enum.valueOf()方法。 http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#valueOf(java.lang.Class,%20java.lang.String)

这是我的类(class):

enum Foo1 implements Bar {
VALUE1("A"), VALUE2("B");

String me;

Foo1(String me) {
this.me = me;
}

String getMe() {return me;}
}

enum Foo2 implements Bar {
V1("A"), V2("B");

String me;

Foo2(String me) {
this.me = me;
}

String getMe() {return me;}
}

interface Bar {
String getMe();
}

enum Z {
Z1(Foo1.class), Z2(Foo2.class);
private final Class<? extends Enum<? extends Bar>> myEnum;
Z(Class<? extends Enum<? extends Bar>> myEnum) {
this.myEnum = myEnum;
}

Class<? extends Enum<? extends Bar>> getMyEnum() {
return myEnum;
}
}

class X {
public getMe(Z z, String fooValue) {
Class<? extends Enum<? extends Bar>> fooEnum = z.getMyEnum();
// does not compile
return ((Bar)Enum.valueOf(fooEnum, fooValue)).getMe();
}
}

最佳答案

执行此操作的简单方法是转换为原始类型 Class:

return ((Bar)Enum.valueOf((Class)fooEnum, fooValue)).getMe();

如果您不喜欢转换,您可以在将枚举类放入 Z 中时将它们包装在另一个类中,以保留更多它们的类型关系。

enum Z {
Z1(new Holder<>(Foo1.class)), Z2(new Holder<>(Foo2.class));
private final Holder<?> myEnum;

Z(Holder<?> myEnum) {
this.myEnum = myEnum;
}
Holder<?> getMyEnumHolder() {
return myEnum;
}

static class Holder<T extends Enum<T> & Bar> {
private final Class<T> myEnum;

private Holder(Class<T> myEnum) {
this.myEnum = myEnum;
}

Class<T> getMyEnum() {
return myEnum;
}
}
}

class X {
public static String getMe(Z z, String fooValue) {
return Enum.valueOf(z.getMyEnumHolder().getMyEnum(), fooValue).getMe();
}
}

关于java - 正确地转换泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26416888/

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