返回信息流在学习泛型时,发现这样一个问题,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所代表的实际类型
}
}
这是一条镜像帖。来源:北邮人论坛 / java / #50965同步于 2016/6/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
【求助】请教关于java泛型的一个知识!
johnson123
2016/6/13镜像同步25 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
卧槽……
【 在 nuanyangyang 的大作中提到: 】
: https://bbs.byr.cn/#!article/Java/38744?au=nuanyangyang
【 在 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,理解不深,麻烦了!