java – Foreach通过不同的对象,但都可以实现相同的接口?
假设我有这个
interface Movable {//some stuff} 我有 class Car implements Movable {//some stuff} 也许我有 class Bike implements Movable {//some stuff} 我注意到如果我有这个: ArrayList<Movable> movableThings = new ArrayList<Movable>(); movableThings.add(some kind of Car) movableThings.add(some kind of Bike) movableThings.add(some kind of Bike) 这可以称为: for(Movable m: movableThings) 但如果我这称呼我,我会得到不兼容的类型: for(Bike b: movableThings) 有人可以解释,也许可以提供更好的方法吗? 编辑:好的,谢谢你们澄清……所以我想我要么使用instanceof,要么重新设计我的游戏 解决方法
我不建议使用instanceof.实现公共接口的两种类型的要点是,在使用接口时,消费者代码不应该关注具体的实现.当我在equals()之外看到instanceof时,我往往会非常怀疑.
如果您想要来自不同实现的不同行为,请使用多态分派而不是instanceof: interface Movable { void move(); } class Bike implements Movable { public void move() { // bike-specific implementation of how to move } } class Car implements Movable { public void move() { // car-specific implementation of how to move } } 将针对每种类型调用特定于实现的方法: for (Movable m : movableThings) { m.move(); } 如果您只想迭代自行车类型,请创建仅包含自行车的集合: List<Bike> bikes = new ArrayList<Bike>(); // etc... for (Bike bike : bikes) { // do stuff with bikes } 注:您几乎应该始终将集合声明为List(接口)而不是ArrayList(接口的实现). 也可以看看 > Avoiding instanceof in Java 如果您还没有,您可能还想阅读The Java Tutorials: Interfaces and Inheritance. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – 为什么Collection.toArray(T [])不采用E []
- java – 在spring框架中使用代理(动态代理)的意思是什么?
- C语言中的volatile
- 基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(详
- java – JdbcTemplate queryForList返回值,如果没有结果
- Struts2 ActionContext.getSession()法:获取session
- java 两个数组合并的几种方法
- java – ArrayList .contain给出奇怪的输出
- java – Eclipse不会在程序包资源管理器视图中刷新项目文件
- 关于Openfire集群源码的分析