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 bodies) { 

顺便说一下,请注意我将变量更改为bodies而不是_bodies 。 下划线不是标准Java编码约定的一部分。


编辑以回应OP的评论

让我们说,你有一个名为Damagable具体类,而不是一个接口。 告诉编译器 说它不一定是Damagable的实例。 这种类型扩展 Damagable 。 否则,编译器会假定您具有Damagable

当你认为Damagable是一个接口时,它并没有多大意义,因为没有你会拥有Damagable实例的Damagable 。 但它们的工作方式基本相同。

您必须记住,您正在使用Java 类型 ,而不是类。 Java的类型语法和结构不如它的类结构健壮。 在类型方面,没有implements概念。


上一轮编辑

最后,我应该注意,对于方法/构造函数参数和方法返回类型使用接口通常更好。 这允许您和使用您的方法的人使用您喜欢的任何实现,并允许您根据需要更改您的实现。

因此,对于这些修订,您将拥有:

 public CollisionManager(List bodies) { 

试试ArrayList _bodies ArrayList _bodies

这表示你想要一个由扩展(很好实现)可DamageableClass组成的ArrayList

毫无疑问,其他人将从Java语法角度指出技术解决方案。

我只想提一些你应该考虑的设计问题:

  • 您的BaseObject实现了Damageable。 这意味着所有BaseObject都是可损坏的。 那么为什么不做一个CollisionManager(ArrayList) ? 除非你打算在其他地方使用Damageable(即有些东西是可破坏但不是BaseObjects),那么它似乎是一种不必要的抽象。
  • 通常,对于游戏/模拟中的碰撞检测,您可能希望使用空间数据结构进行碰撞检测(例如八叉树,四叉树或AABB树)而不是ArrayList。 在ArrayList中搜索冲突是O(n ^ 2)算法。 如果你有很多活动对象,这将成为一个大问题。
  • 损坏似乎是一个坏名字,因为function涉及碰撞检测而不是损坏 – 不会碰到更好吗?