首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

哪位高手能帮小弟我解释一下定义泛型下界时,使用getSuperclass()不能编译

2012-06-13 
谁能帮我解释一下定义泛型下界时,使用getSuperclass()不能编译?class Toy{}class FancyToy extends Toy{}p

谁能帮我解释一下定义泛型下界时,使用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 语言规范 不是很好懂。
[解决办法]
关于泛型,只要知道“类型擦除”,就能解释日常遇到的大部分问题了。

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

热点排行
Bad Request.