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

Java 泛型
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> 却不能? 谢谢回答!

------解决方案--------------------
Layer 没有定义吧,贴出来的代码里没发现
------解决方案--------------------
test1方法,限定传入的Class参数,必须是继承自Layer2的类的Class
而 test1(new Layer1().getClass()); 
编译器智能识别,你传入的,其实是Layer1.class,而Layer1不符合 extends Layer2的条件,因此报错
------解决方案--------------------
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再好好体会一下其中的区别


------解决方案--------------------
Class<? extends Layer2>

class代表任意类,不限定。
泛型条件限定类型为Layer2的子类。

Layer1代表Layer1类型的类 并且反省条件还得是集成Layer2的

就好比参数 是Object object 那么参数object必须是Object类型的,而 某个绝提类 如Quest quest那参数就必须是Quest的,。