BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #50965同步于 2016/6/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

【求助】请教关于java泛型的一个知识!

johnson123
2016/6/13镜像同步25 回复
在学习泛型时,发现这样一个问题,test1和test2的类型形参都是T,实际调用函数时,两个函数形参一个是String,一个是Object,为什么test1方法可以区分T代指的是谁,执行成功,test2却编译错误,编译器无法识别T所代表的实际类型? package test12; import java.util.*; public class fanxing { static <T> void test1(T[] a, Collection<T> c){ for(T o: a){ c.add(o); } } static <T> void test2(Collection<T> a, Collection<T> c){ for(T o: a){ c.add(o); } } public static void main(String[] args){ String[] str=new String[100]; Collection<Object> co = new ArrayList<>(); Collection<String> cs = new ArrayList<>(); test1(str,co); test2(cs,co);//编译错误,编译器无法识别T所代表的实际类型 } }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
dss886机器人#1 · 2016/6/13
我猜是因为编译器擦除泛型类型的时候只擦除Collection<T>这种的类型,泛型数组应该能对应起来。。。不知道对不对
nuanyangyang机器人#2 · 2016/6/13
https://bbs.byr.cn/#!article/Java/38744?au=nuanyangyang
cgp机器人#3 · 2016/6/13
学习
dss886机器人#4 · 2016/6/13
卧槽…… 【 在 nuanyangyang 的大作中提到: 】 : https://bbs.byr.cn/#!article/Java/38744?au=nuanyangyang
nuanyangyang机器人#5 · 2016/6/13
一转眼这么多年了…… 【 在 dss886 的大作中提到: 】 : 卧槽…… :
Lamperouge机器人#6 · 2016/6/13
因为泛型T的不变性吗 【 在 nuanyangyang (暖羊羊) 的大作中提到: 】 : 一转眼这么多年了……
nuanyangyang机器人#7 · 2016/6/13
嗯。 【 在 Lamperouge 的大作中提到: 】 : 因为泛型T的不变性吗
dss886机器人#8 · 2016/6/13
我觉得一年前的我比我现在厉害多了……赶紧去复习一遍。。 【 在 nuanyangyang 的大作中提到: 】 : 一转眼这么多年了……
johnson123机器人#9 · 2016/6/13
【 在 nuanyangyang 的大作中提到: 】 : https://bbs.byr.cn/#!article/Java/38744?au=nuanyangyang 白马非马 class 毛 { } class 白毛 extends 毛 { } class 黑毛 extends 毛 { } class 马 { public List<毛> getFurs(); } class 白马 extends 马 { @Override public List<白毛> getFurs(); // ERROR } class Main { public static void main(String[] args) { 马 h1 = new 马(); 马 h2 = new 白马(); List<毛> f1 = h1.getFurs(); List<毛> f2 = h2.getFurs(); f1.add(new 黑毛()); // 往普通马身上加黑毛自然没问题。 f2.add(new 黑毛()); // 根据里氏替换原则,你可以往白马身上加黑毛。但是逻辑不对。 } } 暖神,我看了你给的这段代码,无奈还是没有参悟透彻,希望您能再点拨一下。 关于您的这段代码,我是这样理解的: 白马类中重写了父类的方法时, public List<白毛> getFurs(); // ERROR 这句错误原因在于返回值List<白毛>并不是List<毛>或者其子类,所以不能这么重写 f1.add(new 黑毛()); // 往普通马身上加黑毛自然没问题。 这句,f1这个集合中指定的元素类型为毛,因而,向其中add毛的子类黑毛是完全没有问题的 同理, f2.add(new 黑毛()); // 根据里氏替换原则,你可以往白马身上加黑毛。但是逻辑不对。 也可以向f2中add黑毛 不知道你想说明的问题是啥?以及具体到我的问题上来,他们的联系是什么? 初学java,理解不深,麻烦了!