java泛型约束_Java泛型方法如何返回约束的不同的类型?

谢邀,改成下面这样就好

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>不兼容