Java 泛型

heiyee 2012-06-14 08:23:27
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> 却不能? 谢谢回答!
...全文
172 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
十四月的清晨 2012-06-15
  • 打赏
  • 举报
回复
Class<? extends Layer2>

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

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

就好比参数 是Object object 那么参数object必须是Object类型的,而 某个绝提类 如Quest quest那参数就必须是Quest的,。
阿冷 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

不好意思,昨天弄糊涂了,代码也没看就贴了,下面是缩进了的,也修正了笔误。
package generics;

class Layer1<T> {
public String toString() {
return "Class Layer1.";
}
}

class Layer2 extends Layer1<Layer2> {
public String toStrin……
[/Quote]

简单说

Class<? extends Layer2>
是指要继承Layer2的任意class类

Layer1<? extends Layer2>
说白了,就是Layer1类,但是要求参数是继承Layer2的

这么理解,楼主就能得出结论了吧
heiyee 2012-06-15
  • 打赏
  • 举报
回复
好像这里不支持Eclipse上的缩进,忘了,只能将就一下了。
heiyee 2012-06-15
  • 打赏
  • 举报
回复
不好意思,昨天弄糊涂了,代码也没看就贴了,下面是缩进了的,也修正了笔误。
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>到底有什么不同。 后者在作为参数类型时又有什么含义?
ningtieming 2012-06-14
  • 打赏
  • 举报
回复
代码能不能缩进一下啊,看得好头痛的……
qybao 2012-06-14
  • 打赏
  • 举报
回复
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再好好体会一下其中的区别

RDroid 2012-06-14
  • 打赏
  • 举报
回复
test1方法,限定传入的Class参数,必须是继承自Layer2的类的Class
而 test1(new Layer1().getClass());
编译器智能识别,你传入的,其实是Layer1.class,而Layer1不符合 extends Layer2的条件,因此报错
heiyee 2012-06-14
  • 打赏
  • 举报
回复
Layer1 Layer2 Layer3 三个类是依次的继承关系。test1()方法中不可以用 new Layer1().getClass()作为参数。但是特殊test2()中是同样的继承体系,为什么就没有出问题?
RDroid 2012-06-14
  • 打赏
  • 举报
回复
Layer 没有定义吧,贴出来的代码里没发现

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧