我正在尝试调用 Enum<E>
类的静态方法 valueOf()
但我收到一个编译错误。
请查看下面的代码片段。
public void hello(Class<? extends Enum<?>> q){
Object o= Enum.valueOf(q,"hello");
}
IntelliJ IDEA 可以很好地遵守以下代码,但 Eclipse 会出现编译错误:
最佳答案
我不知道 IntelliJ 的工作原理,但我可以告诉你它无法编译的原因。
类Enum<T extends Enum<T>>
中定义的方法
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
第一个参数是类型 T
的类由 T extends Enum<T>
定义。也就是说,它使用与其自身相同的泛型类型扩展了枚举类型。
当您调用第一个参数为的方法时
Class<? extends Enum<?>>
您没有指定两个 ?
根据需要,它们实际上是相同的类型。这会引发不匹配错误。
你可以用你的方法做的就是把它变成通用的:
public static <E extends Enum<?>> void hello(Class<E> q)
但是正如你可以想象的,这仍然无法编译,因为 ?
不一定E
。所以你需要拼写出来:
public static <E extends Enum<E>> void hello(Class<E> q)
这将编译。
编辑:另一种思考方式
您可以考虑修复方法签名
public void hello(Class<? extends Enum<?>> q)
将其更改为
public void hello(Class<E extends Enum<E>> q)
只是为了指定两个通配符相同。概念是对的,但语法不合法。您必须定义什么 E
是(通过使你的方法通用或你的类)。
关于java - 为什么使用通配符调用 Enum.valueOf() 时会出现绑定(bind)不匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34516444/