java - 为什么使用通配符调用 Enum.valueOf() 时会出现绑定(bind)不匹配错误

标签 java generics enums mismatch bounded-wildcard

我正在尝试调用 Enum<E>类的静态方法 valueOf()但我收到一个编译错误。 请查看下面的代码片段。

public void hello(Class<? extends Enum<?>> q){  
    Object o= Enum.valueOf(q,"hello");      
}

IntelliJ IDEA 可以很好地遵守以下代码,但 Eclipse 会出现编译错误:

enter image description here

最佳答案

我不知道 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/

相关文章:

java - 类之间的区别<?扩展 A> 与仅 A

generics - 我对同一个类有两个 Kotlin 扩展方法,但是具有不同的通用签名并且编译器会提示

java - 错误 : cannot find symbol IOUtils. 复制(输入,输出);

java - 类型不匹配无法从 String 转换为 int

c# - 将 object[] 类型转换为泛型类型 K,它也是一个数组

java - 强制开发人员显式定义配置数据的键

java - 如何使用枚举而不每次都指定枚举类?

powershell - 在 PowerShell 中使用枚举类型

java - 使用 ScheduledExecutorService 以固定间隔并行运行多个线程

java - 删除 Spring RepositoryRestResource 中的 "_embedded"属性