首页 / JAVA / 参数化集合中的Java继承存在疑问
参数化集合中的Java继承存在疑问
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了参数化集合中的Java继承存在疑问,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1216字,纯文字阅读大概需要2分钟。
内容图文
![参数化集合中的Java继承存在疑问](/upload/InfoBanner/zyjiaocheng/812/61e2dc9eac224c07b1c2e7cdd339390f.jpg)
很明显,父类的对象可以保存对子进程的引用,但是在参数化集合的情况下这不适用吗?
例如:
Car class is parent of Sedan
所以
public void doSomething(Car c){
...
}
public void caller(){
Sedan s = new Sedan();
doSomething(s);
}
显然是有效的
但
public void doSomething(Collection<Car> c){
...
}
public void caller(){
Collection<Sedan> s = new ArrayList<Sedan>();
doSomething(s);
}
无法编译
有人可以指出为什么?而且,如何实现这样一种场景,其中函数需要迭代父对象的集合,仅修改父类中存在的字段,使用父类方法,但调用方法(比如3种不同的方法)传递集合三种不同的亚型..
当然,如果我这样做,它编译得很好:
public void doSomething(Collection<Car> c){
...
}
public void caller(){
Collection s = new ArrayList<Sedan>();
doSomething(s);
}
解决方法:
使用
public void doSomething(Collection<? extends Car> c){}
或(如建议的那样)
public <T extends Car> void doSomething(Collection<T> c){}
这意味着Collection是Car(或Car本身)的任何子类,而不是“它只是Car实例的集合”
这是因为集合是不变的,不像数组是协变的.引用Effective Java:
Covariant [..] means that if
Sub
is a subtype ofSuper
, then the array typeSub[]
is a subtype ofSuper[]
. Generics, by contrast, are invariant: for any two distinct typesType1
andType2
,List<Type1>
is neigther a subtype nor a supertype ofList<Type2>
.
内容总结
以上是互联网集市为您收集整理的参数化集合中的Java继承存在疑问全部内容,希望文章能够帮你解决参数化集合中的Java继承存在疑问所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。