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