日期:2014-05-20  浏览次数:20687 次

谁能帮我解释一下定义泛型下界时,使用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<? super FancyToy> up2 = ftClass.getSuperclass();就行了

ftClass.getSuperclass()返回的是Class<? super FancyToy>

虽然ftClass的基类确实是Toy,但是编译器并不认为Class<Toy>和Class<? super FancyToy>是一样的……

------解决方案--------------------
泛型的确不好理解,请看
Java code

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();
}
}

------解决方案--------------------
书上这么说的
探讨

Class<Toy>和Class<FancyToy>并不是两种类型,他们都是同一种类型,就是Class

------解决方案--------------------
正在研究泛型,搞了1个多星期了,感觉还是好多概念很模糊。java 语言规范 不是很好懂。
------解决方案--------------------
关于泛型,只要知道“类型擦除”,就能解释日常遇到的大部分问题了。

更深入的去看官方文档的关于协变和逆变的部分。