繁体   English   中英

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

[英]Return generic class which extends Enum and implements and Interface-Java

我有一个界面:

public MyInterface {};

并且实现MyInterface枚举很少:

public enum MyFirstEnums implements MyInterface{};

在另一个类中,我需要一个方法来返回Class对象,使得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推断出type参数( 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;
    }

}

我会尝试一些回应:

您想要定义一个方法,该方法返回一些未完全定义的类类型,但它遵循:extends Enum&MyInterface。

并且您的类不会传递给方法。

我怀疑它不可能或不安全。

我会 :

1传递一个我想要的类作为参数

2反向测试:我测试内部是否Class <E>扩展Enum&MyInterface和MyFirstEnum.class,如果MyFirstEnum.class扩展类<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");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM