Java泛型方法怎样返回约束的不同的类型

谢邀,改成下面这样就好
public Class\u0026lt;? extends I\u0026gt; toClass() { if (this == A) return ClassA.class; else if (this == B) return ClassB.class; else return null;}下面所有讨论不考虑toClass()返回null的情形....
考虑下面这个调用的场景:
Class\u0026lt;Xxx\u0026gt; clazz = Yyy.toClass();Xxx可以是ClassA,也可以是ClassB
Yyy可以是TestEnum.A也可以是TestEnum.B
实际擦除之后会变成下面这样:
Class clazz = (Xxx) Yyy.toClass(); 【Java泛型方法怎样返回约束的不同的类型】 换句话说,需要保证toClass()方法的所有可能的返回值,都必须能够强制转换为所有可能的Xxx。然而比如ClassB.class是toClass()的一种可能的返回值,而ClassA是Xxx的一种可能的类型,它俩并不能转换。
而使用通配符就不一样了,只要是你返回的类型是extends I的,我通吃,使用通配符的时候会变成下面这样
Class\u0026lt;?\u0026gt; clazz = Yyy.toClass();这个意思就是返回的Class的具体类型我不知道,但是我知道这个类型必须要extends I(因为在toClass()方法上限制了嘛\u0026lt;? extends I\u0026gt;),换句话说,只要你返回的类型是I或者I的子类/子接口,我都认,再换句话说就是只要你返回的类型能够向上提升为I,我都认,也即下面这样
Class clazz = (I)Yyy.toClass();现在这个Yyy.toClass()就只能返回ClassA或者ClassB,这俩都能提升为I,所以没有问题。但是如果你在toClass()方法的某个return的地方返回一个Object.class的话,它就会告诉你,Class\u0026lt;Object\u0026gt;和Class\u0026lt;? extends I\u0026gt;不兼容

■网友
使用强转public class Test { public static void main(String args) { System.out.println(TestEnum.A.toClass() == new ClassA().getClass()); }}enum TestEnum { A, B; public \u0026lt;T extends I\u0026gt; Class\u0026lt;T\u0026gt; toClass() { if (this == A) return (Class\u0026lt;T\u0026gt;) ClassA.class; else if (this == B) return (Class\u0026lt;T\u0026gt;) ClassB.class; else return null; }}interface I {}class ClassA implements I {}class ClassB implements I {}不知道这个是不是你想要的效果


    推荐阅读