Java中Enum.valueOf()应使用的正确Class泛型是什么?
问题解答:枚举泛型与Class参数的类型匹配问题
问题根源
你遇到的编译错误本质是泛型约束不匹配:Enum.valueOf的方法签名是static <E extends Enum<E>> E valueOf(Class<E> enumType, String name),它要求传入的Class<E>必须对应一个满足E extends Enum<E>的枚举类型——也就是枚举自身作为泛型参数的自限约束。
而你原代码中C类的泛型声明是T extends Enum<? extends A>,这里的T只是Enum的子类型,但Enum的泛型参数是? extends A(和T本身无关),编译器无法确认T符合E extends Enum<E>的要求,因此直接传入Class<T>会触发编译错误。
正确解法:调整泛型约束
无需抑制警告的正确写法是修改C类的泛型声明,让T同时满足两个约束:既是符合自限要求的枚举类型,又实现A接口。具体代码如下:
interface A {} enum B implements A { TEST; } class C<T extends Enum<T> & A> { public C(Class<T> t) { T test = T.valueOf(t, "TEST"); } }
为什么这样可行
T extends Enum<T> & A的约束做了两件事:
Enum<T>保证了T是一个满足E extends Enum<E>的枚举类型,完美匹配Enum.valueOf对类型参数E的要求;& A保证了T实现了A接口,保留了你原代码的业务约束。
这样构造器中传入Class<T>后,调用T.valueOf(t, "TEST")完全符合类型安全要求,既不需要强制转换,也不会出现任何泛型警告。
关于原约束的局限性
你原有的T extends Enum<? extends A>约束过于宽泛,它允许T是任何实现A的枚举的父类型(虽然实际枚举无法继承),但无法满足Enum.valueOf对枚举类型自限的要求,因此没有办法直接通过调整Class的泛型参数来解决——必须修正T本身的泛型约束才能从根源解决类型匹配问题。
内容的提问来源于stack exchange,提问作者Scoopta
相关产品推荐
相关产品推荐

