gpt4 book ai didi

java - 返回扩展 Enum 并实现和 Interface-Java 的泛型类

转载 作者:行者123 更新时间:2023-11-30 08:06:43 32 4
gpt4 key购买 nike

我有一个界面:

public MyInterface {};

很少有实现 MyInterface 的枚举作为:

public enum MyFirstEnums implements MyInterface{};

在另一个类中,我需要一个方法来返回 Class对象使得类应该像 MyFirstEnums ,它扩展了枚举并实现了 MyInterface。

方法的返回类型应该是:<E extends Enum<?> & MyInterface> ,它应该允许返回 MyFirstEnums.class 和类似的枚举

我试着这样做:

public <E extends Enum<?> & MyInterface> Class<E> getClazz(){
return MyFirstEnums.class;
}

但这给我的错误是:

Type mismatch: cannot convert from Class<MyFirstEnums> to Class<E> 

我在这里错过了什么?

在其他地方,我尝试了一种将此类类型作为参数的方法,并且效果很好:

public <E extends Enum<?> MyInterface> void doSomething(Class<E> myClazz){};
//it rightly checks the type of myClazz while calling this method

最佳答案

您不能只返回 MyFirstEnum 的类对象。您的方法被声明为返回对应于枚举并实现 MyInterface 的类对象,但它可以是除 MyFirstEnum 之外的枚举,它也符合此条件。假设您有另一个枚举:

public enum MySecondEnum implements MyInterface { }

你也可以这样做:

Class<MySecondEnum> clazz = getClazz();

编译器从 clazz 的目标返回类型推断类型参数(E 被推断为 MySecondEnum)。在这种情况下,显然很可能会发生运行时异常。例如,当您尝试从返回的类中实例化一个对象时,您会得到一个 java.lang.InstantiationException

请注意,您的方法实际上并未使用类型参数,那么为什么一开始就使用泛型呢?

如果你想要一个“通用”的方式来为每个实现接口(interface)的枚举返回类对象,你可以这样做:

abstract class EnumProvider<E extends Enum<?> & MyInterface> {
...
public abstract Class<E> getClazz();
}


class MyFirstEnumProvider extends EnumProvider<MyFirstEnums> {
...
@Override
public Class<MyFirstEnums> getClazz() {
return MyFirstEnums.class;
}

}

关于java - 返回扩展 Enum 并实现和 Interface-Java 的泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34185850/

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