【问题标题】:Why I can not return enum with interface?为什么我不能用接口返回枚举?
【发布时间】:2016-02-04 07:50:45
【问题描述】:

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

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

Intellij idea 告诉我“必需的 E,找到 com.mypackage.MyEnum”。

必须是这样的:

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

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

【问题讨论】:

  • 请告诉我们MyEnum
  • 听起来MyEnum 没有实现MyInterface。但如果是这样,为什么不直接使用MyEnum 作为返回类型呢?或者你能返回不同类型的枚举吗?
  • 请注意,您没有获得此方法的任何类型保证。它的返回值可以分配给任何引用类型而不会出现编译错误:java.awt.Point p = getParametrizedEnum(); 请参阅stackoverflow.com/q/338887/3385618

标签: java interface enums type-constraints


【解决方案1】:

问题是该方法没有返回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); 
}

【讨论】:

  • 为什么他们需要分配兼容?我可以从返回Iterable 的方法中返回ArrayList,即使还有其他实现Iterable 的类。这种情况有何不同?如果编译器允许这个return 语句会出现什么问题?
  • 但它们是分配兼容的。 Iterable&lt;String&gt; a = new ArrayList&lt;&gt;() 完全合法。
  • 哦,我现在明白了。您添加的示例很有启发性,谢谢。
  • 主要问题是返回 2 个枚举而不是一个。这就是为什么我需要在这里使用接口来限制枚举数。可以返回一个接口,但是在这种情况下枚举切换会丢失:(
猜你喜欢
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
相关资源
最近更新 更多