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

关于接口中使用List作为参数

dss886
2015/2/23镜像同步28 回复
我定义了这么一个Interface 一个Class继承这个Interface以后, 发现write函数传入参数为List<String>时无法通过编译 而返回值为List<String>的read函数却能通过编译 求问什么原因。。。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
june0334机器人#1 · 2015/2/23
你一个有泛型,一个没有,是不一样的
dss886机器人#2 · 2015/2/23
但是编译时不是会擦除类型的吗?。。 【 在 june0334 的大作中提到: 】 : 你一个有泛型,一个没有,是不一样的
june0334机器人#3 · 2015/2/23
【 在 dss886 的大作中提到: 】 : 但是编译时不是会擦除类型的吗?。。 : 但是在编译之前,编译器已经认为它们是不同的了,类型检查不能通过。我之前见过绕过泛型直接编译的,好像是用的反射做的。
wolfer机器人#4 · 2015/2/23
f(List<String>) in B and f(List) in A have the same erasure, yet neither overrides the other
nuanyangyang机器人#5 · 2015/2/23
白马非马 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 黑毛()); // 根据里氏替换原则,你可以往白马身上加黑毛。但是逻辑不对。 } } 所以,在Java里面,白马不是一种马。
dss886机器人#6 · 2015/2/23
read()函数为什么又不报错,能通过编译。。。 【 在 june0334 的大作中提到: 】 : 但是在编译之前,编译器已经认为它们是不同的了,类型检查不能通过。我之前见过绕过泛型直接编译的,好像是用的反射做的。
dss886机器人#7 · 2015/2/23
啊?。。 【 在 wolfer 的大作中提到: 】 : f(List<String>) in B and f(List) in A have the same erasure, yet neither overrides the other
dss886机器人#8 · 2015/2/23
智商捉急。。。我没看懂暖神想表达什么。。 【 在 nuanyangyang 的大作中提到: 】 : 白马非马 : [code=java] : class 毛 { : ...................
bixiaopeng机器人#9 · 2015/2/23
第一,虽然会擦除类型,但是编译时的检查还是会有的,不然要范型编译不检查,运行不用到,,,当注释么,,, 第二,比如,你有个类实现了这个接口,那么,这个类的实例可以直接作为符合该接口的实例用的。我们看这个接口,read返回一个List,那么你这个类的read无论返回List<E>是什么,这个List<E>都可以作为list用,没有问题。 但是,这个write,接受的是一个List,你这个类的write接受的是一个List<String>。那么比如,如果这个write用了String的方法,那么把这个类的某个实例当TestInterface用的时候,传入List<Artical>也符合你接口的定义,但是就不符合你类的定义了。所以这个时候算没有实现。 第三,List不加类型这么用我记得四年前就下划黄线表示呀咩爹了。。。这是Intellij?