gpt4 book ai didi

java - 集合或可变参数中的通用枚举

转载 作者:太空宇宙 更新时间:2023-11-04 06:54:19 24 4
gpt4 key购买 nike

我正在尝试创建 enum 类的集合,以便可以迭代该集合,然后通过调用 enumClass.getEnumConstants() 迭代枚举值。

鉴于以下情况:

public interface MyEnumType {
String getSubtype ();
}

public enum MyEnumTypeA implements MyEnumType {
A_1,
A_2;
public String getSubtype () { return "A"; }
}

public enum MyEnumTypeB implements MyEnumType {
B_1,
B_2;
public String getSubtype () { return "B"; }
}

我尝试过使用可变参数:

private <T extends Enum<T> & MyEnumType> void handleTypes (
Class<? extends T>... enumTypes )
{
for( Class<? extends T> enumType : enumTypes )
for( T value : enumType.getEnumConstants() )
handleValue( value );
}

private void doStuff () {
// error here
handleTypes( MyEnumTypeA.class, MyEnumTypeB.class );
}

...但是每当我尝试调用该函数时,在可变参数中使用通配符泛型都会产生编译错误

我还尝试过构建一个列表:

public class MyMainClass
{
private static Collection<Class<Enum<? extends MyEnumType>>> ALL_TYPES
= Lists.newArrayList();
{
// error here
ALL_TYPES.add( MyEnumTypeA.class );
ALL_TYPES.add( MyEnumTypeB.class );
}
}

...但是当我尝试添加到列表时,这也无法编译。

以下内容有效,但需要强制转换(如果我传入Object.class,则不会出现编译错误或警告):

private void runNoMatchTests ( Class... enumTypes ) {
for( Class enumType : enumTypes ) {
for( MyEnumType value : ( (Class<MyEnumType>)enumType ).getEnumConstants() ) {
handleValue( value );
}
}
}

如何在不使用强制转换的情况下完成此操作?可以不使用类型转换来完成吗?

最佳答案

我不完全确定为什么会出现这种情况,但是如果您更改<T extends Enum<T> & MyEnumType>,您的第一次尝试可以编译。至<T extends Enum<?> & MyEnumType>如下图:

private <T extends Enum<?> & MyEnumType> void handleTypes(Class<? extends T>... enumTypes) {
...
}

关于java - 集合或可变参数中的通用枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22947764/

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