package simpleTest;class Layer1<T> {
public String toString() {
return "Class Layer1.";
}
}
class Layer2 extends Layer1<Layer2> {
public String toString() {
return "Class Layer2.";
}
}
class Layer3 extends Layer2 {
public String toString() {
return "Class Layer3.";
}
}
class Generic<T> {
}
public class GenericTest2 {
public static void test1(Class<? extends Layer2> lay){
System.out.println(lay);
}
public static void test2(Layer<? extends Layer2> lay){
    System.out.println(lay);
}
public static void main(String[] args) {
test1(new Layer3().getClass());
//test1(new Layer1().getClass());  编译器报错
// 以下不会报错。
test2(new Father());
test2(new Son());
  }
}
我是一个新手,请问一下上面的test1()和test2()方法为什么会出现这样的差异? 我的意思是同样都是继承关系,为什么Class<? extends Layer2> 可以限定参数类型,而Layer<? extends Layer2> 却不能?  谢谢回答!

解决方案 »

  1.   

    Layer 没有定义吧,贴出来的代码里没发现
      

  2.   

    Layer1 Layer2 Layer3 三个类是依次的继承关系。test1()方法中不可以用  new Layer1().getClass()作为参数。但是特殊test2()中是同样的继承体系,为什么就没有出问题?
      

  3.   

    test1方法,限定传入的Class参数,必须是继承自Layer2的类的Class
    而 test1(new Layer1().getClass()); 
    编译器智能识别,你传入的,其实是Layer1.class,而Layer1不符合 extends Layer2的条件,因此报错
      

  4.   

    public static void test1(Class<? extends Layer2> lay) 这里是限定 ? 是Layer2的子类, 而Layer1不是Layer2的子类,所以不行public static void test2(Layer<? extends Layer2> lay){ //此处Layer笔误了吧,是Layer1吧,这样的参数必须要求符合属于Layer1类型,其中泛型是Layer2的子类test2(new Father()); //此处笔误了吧,估计是 test2(new Layer2()); 吧,因为Layer2本身是 extends Layer1<Layer2>的,即Layer2本身是符合属于Layer1的,而泛型<Layer2>也是符合? extends Layer2的test2(new Son()); //这个也笔误了吧,估计是 test2(new Layer3()); 吧,Layer3继承Layer2,而上面分析的Layer2没问题,Layer3自然也就没问题了LZ再好好体会一下其中的区别
      

  5.   

    不好意思,昨天弄糊涂了,代码也没看就贴了,下面是缩进了的,也修正了笔误。
    package generics;class Layer1<T> {
    public String toString() {
    return "Class Layer1.";
    }
    }class Layer2 extends Layer1<Layer2> {
    public String toString() {
    return "Class Layer2.";
    }
    }class Layer3 extends Layer2 {
    public String toString() {
    return "Class Layer3.";
    }
    }public class GenericTest {
    public static void test1(Class<? extends Layer2> lay) {
    System.out.println(lay);
    } public static void test2(Layer1<? extends Layer2> lay) {
    System.out.println(lay);
    } public static void main(String[] args) {
    test1(new Layer3().getClass());
    // test1(new Layer1().getClass()); 编译器报错
    // 以下不会报错。
    test2(new Layer1());
    test2(new Layer2());
    }
    }就是想知道Class<? extends Layer2>   与 Layer1<? extends Layer2>到底有什么不同。 后者在作为参数类型时又有什么含义?
      

  6.   

    好像这里不支持Eclipse上的缩进,忘了,只能将就一下了。
      

  7.   


    简单说Class<? extends Layer2> 
    是指要继承Layer2的任意class类Layer1<? extends Layer2>
    说白了,就是Layer1类,但是要求参数是继承Layer2的这么理解,楼主就能得出结论了吧
      

  8.   

    Class<? extends Layer2>  class代表任意类,不限定。
    泛型条件限定类型为Layer2的子类。Layer1代表Layer1类型的类 并且反省条件还得是集成Layer2的就好比参数 是Object object 那么参数object必须是Object类型的,而 某个绝提类 如Quest quest那参数就必须是Quest的,。