我有一个界面:
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
答案 0 :(得分:3)
您无法返回MyFirstEnum
的类对象。声明您的方法返回一个与枚举对应的类对象并实现MyInterface
,但它可以是MyFirstEnum
以外的枚举,也符合此条件。想象一下,你有另一个枚举:
public enum MySecondEnum implements MyInterface { }
你也可以这样做:
Class<MySecondEnum> clazz = getClazz();
编译器从目标返回类型clazz
推断出类型参数(E
被推断为MySecondEnum
)。在这种情况下,很明显可能会发生运行时异常。例如,当您尝试从返回的类中实例化对象时,您将获得java.lang.InstantiationException
。
请注意,您的方法实际上并不使用类型参数,那么为什么首先要使用它?
如果你想要一个&#34;泛型&#34;为每个实现接口的枚举返回类对象的方法,你可以这样做:
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;
}
}
答案 1 :(得分:0)
我会尝试一些回应:
你想要定义一个返回某个类类型的方法,这个类型没有完全定义,但它尊重:extends Enum&amp; MyInterface的。
您的班级不会传递给该方法。
我怀疑这是不可能或不安全的。
我会:
1传递一个我想要的类作为参数
2逆测试:我在里面测试Class&lt; e基扩展Enum&amp; MyInterface和MyFirstEnum.class以及MyFirstEnum.class是否扩展了类&lt; e基
3当然是Class result = MyFirstEnum.class;可能更复杂,以前不知道...
这个编译(因为测试是在运行时进行的),但我不知道它是否可以帮助你。
public <E> Class<E> getClazz(Class< E> _return_class) throws Exception
{
Class result=MyFirstEnum.class;
if (MyInterface.class.isAssignableFrom(_return_class) )
if (Enum.class.isAssignableFrom(_return_class))
if (_return_class.isAssignableFrom(result))
return (Class<E>) result;
throw new Exception("Bad Class");
}