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

解决方案 »

  1.   

    改成Class<? super FancyToy> up2 = ftClass.getSuperclass();就行了ftClass.getSuperclass()返回的是Class<? super FancyToy>虽然ftClass的基类确实是Toy,但是编译器并不认为Class<Toy>和Class<? super FancyToy>是一样的。而且反射是通过RTTI(RunTimeTypeInfo)实现的,很多事情编译器都不能确定。
      

  2.   

    我的疑惑是,ftClass.getSuperclass()返回的是ftClass的基类,它的基类不是Toy吗?为什么ftClass.getSuperclass()返回的是Class<? super FancyToy>?
      

  3.   

    Toy 是FancyToy的父类型
    Class<Toy>并不是Class<FancyToy>的父类型
      

  4.   


    意思是Class<FancyToy>的父类型就是Class<? super FancyToy>而不是别的?
      

  5.   

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

  6.   

    FancyToy的基类确实是Toy,但是编译器不认为Class<? super FancyToy>和Class<Toy>是一会事,你能一眼看出的事情编译器并不一定知道,说不定你什么时候一高兴来一句(Ojbect)ftClass,编译器就傻了。
      

  7.   

    泛型的确不好理解,请看
    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();
    }
    }编译通过:
    ---------- JAVAC ----------
    注: test.java使用了未经检查或不安全的操作。
    注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。输出完成 (耗时 0 秒) - 正常终止
      

  8.   

    正在研究泛型,搞了1个多星期了,感觉还是好多概念很模糊。java 语言规范 不是很好懂。
      

  9.   

    java编程思想类型信息一章中似乎对这个问题有描述,第四版320页,14.2.2泛化的Class引用,部分摘抄如下:Class<Number> genericNumberClass = int.class;
    这看起来似乎是起作用的,因为Integer继承自Number。但是它无法工作,因为Integer Class对象不是Number Class对象的子类(这看起来可能有些诡异,我们将在第15章深入讨论它)。