返回扩展Enum和implements和Interface-Java的泛型类

时间:2015-12-09 18:02:09

标签: java generics enums

我有一个界面:

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

2 个答案:

答案 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");
}