为什么我不能用界面返回枚举?

时间:2016-02-04 07:50:45

标签: java interface enums type-constraints

看看this回答。一切都很好,除了:

public <E extends Enum<E> & MyInterface> E getParametrizedEnum() {
    String someString = "..."
    return MyEnum.valueOf(someString); //compile error here
}

Intellij的想法告诉我&#34;要求E,找到com.mypackage.MyEnum&#34;。

必须像那样演员:

public <E extends Enum<E> & MyInterface> E getParametrizedEnum() {
    String someString = "..."
    return (E) MyEnum.valueOf(someString); //compile error here
}

有没有办法在没有强制转换的情况下使用接口返回参数化枚举?

1 个答案:

答案 0 :(得分:2)

问题是该方法不返回MyEnum,它返回一些扩展EnumMyInterface的类。即使MyEnum满足这些约束条件,也可能有其他枚举也会实现MyInterface,而这些枚举不一定与MyEnum兼容。

考虑以下计划:

interface MyInterface {} 
enum MyEnum implements MyInterface {
    A, B, C
}
enum YourEnum implements MyInterface {
    D, E, F
}

public class Foo
{
    public <E extends Enum<E> & MyInterface> E getParametrizedEnum() {
        String someString = "A";
        return (E) MyEnum.valueOf(someString); 
    }

    public static void main(String... args) {
        Foo foo = new Foo();
        YourEnum b = foo.getParametrizedEnum(); // Ooops!
    }
}

它编译完全正常,但在运行时抛出ClassCastException

但是如果你还是返回MyEnum,你为什么需要泛型?你可以这样做:

public MyEnum getParametrizedEnum() {
    String someString = "..."
    return MyEnum.valueOf(someString); 
}