Java – 传递接口类型的ArrayList
我有一个可破坏的接口,如下所示
public interface Damageable { public void handleCollision(float impulse); }
一个实现此接口的类,BaseObject
public class BaseObject implements Damageable
现在在第三个类中,我有一个BaseObject类型的ArrayList
public class ObjectManager { public ArrayList bodies;
我想要做的是将ArrayList主体传递给另一个接受ArrayList的类的方法
public CollisionManager( ArrayList _bodies) { bodies = _bodies; }
Java不允许我做新的CollisionManager(主体),其中的主体是ArrayList类型,而BaseObject实现了Damageable
我试过铸造。 说无法从ArrayList
为ArrayList也尝试使用Class
Class
但是我无法调用接口Damageable中声明的方法。 我怎样才能传递ArrayList?
你必须明确你的generics。 因此,您必须通知编译器您的generics类型本身不必是Damagable
,而是可以扩展 Damagable
:
public CollisionManager(ArrayList extends Damagable> bodies) {
顺便说一下,请注意我将变量更改为bodies
而不是_bodies
。 下划线不是标准Java编码约定的一部分。
编辑以回应OP的评论
让我们说,你有一个名为Damagable
的具体类,而不是一个接口。 告诉编译器 extends Damagable>
extends Damagable>
说它不一定是Damagable
的实例。 这种类型扩展 Damagable
。 否则,编译器会假定您具有Damagable
。
当你认为Damagable
是一个接口时,它并没有多大意义,因为没有你会拥有Damagable
实例的Damagable
。 但它们的工作方式基本相同。
您必须记住,您正在使用Java 类型 ,而不是类。 Java的类型语法和结构不如它的类结构健壮。 在类型方面,没有implements
概念。
上一轮编辑
最后,我应该注意,对于方法/构造函数参数和方法返回类型使用接口通常更好。 这允许您和使用您的方法的人使用您喜欢的任何实现,并允许您根据需要更改您的实现。
因此,对于这些修订,您将拥有:
public CollisionManager(List extends Damagable> bodies) {
试试ArrayList extends Damageable > _bodies
ArrayList extends Damageable > _bodies
。
这表示你想要一个由扩展(很好实现)可Damageable
的Class
组成的ArrayList
毫无疑问,其他人将从Java语法角度指出技术解决方案。
我只想提一些你应该考虑的设计问题:
- 您的BaseObject实现了Damageable。 这意味着所有BaseObject都是可损坏的。 那么为什么不做一个
CollisionManager(ArrayList
? 除非你打算在其他地方使用Damageable(即有些东西是可破坏但不是BaseObjects),那么它似乎是一种不必要的抽象。) - 通常,对于游戏/模拟中的碰撞检测,您可能希望使用空间数据结构进行碰撞检测(例如八叉树,四叉树或AABB树)而不是ArrayList。 在ArrayList中搜索冲突是O(n ^ 2)算法。 如果你有很多活动对象,这将成为一个大问题。
- 损坏似乎是一个坏名字,因为function涉及碰撞检测而不是损坏 – 不会碰到更好吗?