gpt4 book ai didi

java - 为什么我不能返回带接口(interface)的枚举?

转载 作者:行者123 更新时间:2023-11-30 08:41:15 25 4
gpt4 key购买 nike

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
}

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

最佳答案

问题是该方法不返回 MyEnum,它返回一些扩展 EnumMyInterface 的类。即使 MyEnum 满足这些限制,也可能有 other 枚举也实现了 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);
}

关于java - 为什么我不能返回带接口(interface)的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35195345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com