我有一个接口:
public MyInterface {};
以及实现MyInterface
为的少数枚举
public enum MyFirstEnums implements MyInterface{};
在另一个类中,我需要一个方法来返回Class
对象,这样类应该类似于MyFirstEnums
,它扩展enum并实现MyInterface。
方法的返回类型应该是:<E extends Enum<?> & MyInterface>
,它应该允许返回MyFirstEnums.class和类似的enums
我试着这样做:
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
。
请注意,您的方法实际上并没有使用类型参数,那么为什么首先要使用泛型呢?
如果你想要一种"通用"的方式来为实现接口的每个枚举返回类对象,你可以做一些类似的事情:
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;
}
}
我会尝试一些响应:
您想要定义一个方法,该方法返回一些未完全定义的类类型,但它尊重:extendedEnum&MyInterface。
并且您的类不会传递给该方法。
我怀疑这是不可能的,也不安全。
我会:
1通过一个我想要的类作为参数
2逆测试:如果Class<E> 扩展Enum&MyInterface和MyFirstEnum.class,并且如果MyFirst枚举.class扩展class<E>
3当然Class结果=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");
}