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> 却不能? 谢谢回答!
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> 却不能? 谢谢回答!
而 test1(new Layer1().getClass());
编译器智能识别,你传入的,其实是Layer1.class,而Layer1不符合 extends Layer2的条件,因此报错
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>到底有什么不同。 后者在作为参数类型时又有什么含义?
简单说Class<? extends Layer2>
是指要继承Layer2的任意class类Layer1<? extends Layer2>
说白了,就是Layer1类,但是要求参数是继承Layer2的这么理解,楼主就能得出结论了吧
泛型条件限定类型为Layer2的子类。Layer1代表Layer1类型的类 并且反省条件还得是集成Layer2的就好比参数 是Object object 那么参数object必须是Object类型的,而 某个绝提类 如Quest quest那参数就必须是Quest的,。