谁能帮我解释一下定义泛型下界时,使用getSuperclass()不能编译?
class Toy{
}
class FancyToy extends Toy{
}
public class test{
public static void main(String[] args) throws Exception{
Class<FancyToy> ftClass = FancyToy.class;
FancyToy fancyToy=ftClass.newInstance();
Class<? super FancyToy> up = ftClass.getSuperclass();
//Class<Toy> up2= ftClass.getSuperclass();//谁能解释不可以这样做?ftClass基类不就是Toy吗?
Object obj=up.newInstance();
}
}
[解决办法]
改成Class<? super FancyToy> up2 = ftClass.getSuperclass();就行了
ftClass.getSuperclass()返回的是Class<? super FancyToy>
虽然ftClass的基类确实是Toy,但是编译器并不认为Class<Toy>和Class<? super FancyToy>是一样的。
而且反射是通过RTTI(RunTimeTypeInfo)实现的,很多事情编译器都不能确定。
[解决办法]
Toy 是FancyToy的父类型
Class<Toy>并不是Class<FancyToy>的父类型
[解决办法]
Class<Toy>和Class<FancyToy>并不是两种类型,他们都是同一种类型,就是Class
[解决办法]
FancyToy的基类确实是Toy,但是编译器不认为Class<? super FancyToy>和Class<Toy>是一会事,你能一眼看出的事情编译器并不一定知道,说不定你什么时候一高兴来一句(Ojbect)ftClass,编译器就傻了。
class Toy{}class FancyToy extends Toy{}public class test{public static void main(String[] args) throws Exception{Class<FancyToy> ftClass = FancyToy.class;FancyToy fancyToy=ftClass.newInstance();Class<? super FancyToy> up = ftClass.getSuperclass();Class<Toy> up2= (Class<Toy>)ftClass.getSuperclass();//谁能解释不可以这样做?ftClass基类不就是Toy吗?Object obj=up.newInstance();}}
[解决办法]
书上这么说的