Java 为什么我不能返回带有接口的枚举?

Java 为什么我不能返回带有接口的枚举?,java,interface,enums,type-constraints,Java,Interface,Enums,Type Constraints,看答案。一切都很好,除了: public <E extends Enum<E> & MyInterface> E getParametrizedEnum() { String someString = "..." return MyEnum.valueOf(someString); //compile error here } public E getParameterizeDenum(){ String someString=“…” 返回MyE

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

public <E extends Enum<E> & MyInterface> E getParametrizedEnum() {
    String someString = "..."
    return MyEnum.valueOf(someString); //compile error here
}
public E getParameterizeDenum(){
String someString=“…”
返回MyEnum.valueOf(someString);//此处编译错误
}
Intellij idea告诉我“必需的E,找到com.mypackage.MyEnum”

必须是这样的演员:

public <E extends Enum<E> & MyInterface> E getParametrizedEnum() {
    String someString = "..."
    return (E) MyEnum.valueOf(someString); //compile error here
}
public E getParameterizeDenum(){
String someString=“…”
返回(E)MyEnum.valueOf(someString);//此处编译错误
}

有没有一种方法可以在不强制转换的情况下返回带有接口的参数化枚举

问题在于该方法不返回
MyEnum
,而是返回扩展
Enum
MyInterface
的某个类。即使
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!
    }
}

请告诉我们
MyEnum
听起来好像
MyEnum
没有实现
MyInterface
。但是如果是这样,为什么不直接使用
MyEnum
作为返回类型呢?或者可以返回不同类型的枚举吗?请注意,此方法没有任何类型保证。它的返回值可以直接分配给任何引用类型,而不会出现编译错误:
java.awt.Point p=getParameterizeDenum()查看为什么它们需要与分配兼容?我可以从返回
Iterable
的方法返回
ArrayList
,即使还有其他类实现了
Iterable
。这种情况有何不同?如果编译器允许此
return
语句,会出现什么问题?但它们是赋值兼容的
Iterable a=new ArrayList()
完全合法。哦,我现在明白了。您添加的示例很有启发性,谢谢。主要问题是返回2个枚举而不是一个。这就是为什么我需要这里的接口来限制枚举数。可以返回接口,但在这种情况下,枚举切换丢失:(
public MyEnum getParametrizedEnum() {
    String someString = "..."
    return MyEnum.valueOf(someString); 
}