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