Java - 传递接口类型的ArrayList

wir*_*ate 16 java interface arraylist

我有一个可破坏的接口,如下所示

public interface Damageable {
    public void handleCollision(float impulse);
}
Run Code Online (Sandbox Code Playgroud)

一个实现此接口的类BaseObject

public class BaseObject implements Damageable
Run Code Online (Sandbox Code Playgroud)

现在在第三个类中,我有一个BaseObject类型的ArrayList

public class ObjectManager {    
    public ArrayList<BaseObject> bodies;
Run Code Online (Sandbox Code Playgroud)

我想要做的是将ArrayList主体传递给另一个接受ArrayList的类的方法

public CollisionManager( ArrayList<Damageable> _bodies) {
        bodies = _bodies;
}
Run Code Online (Sandbox Code Playgroud)

Java不允许我做新的CollisionManager(主体),其中的主体是ArrayList类型,而BaseObject实现了Damageable

我试过铸造.说无法转换 ArrayList<BaseObject>为ArrayList也尝试使用Class<? extends Damageable>但后来我无法调用接口Damageable中声明的方法.我怎样才能传递ArrayList?

Tim*_*ote 37

你必须明确你的泛型.因此,你必须通知你的泛型类型没有编译器必须是一个Damagable本身,而是可以扩展 Damagable:

public CollisionManager(ArrayList<? extends Damagable> bodies) {
Run Code Online (Sandbox Code Playgroud)

顺便说一句,注意我改变了你的变量bodies而不是_bodies.下划线不是标准Java编码约定的一部分.


编辑以回应OP的评论

让我们说,你有一个具体的类,而不是一个接口Damagable.告诉编译器<? extends Damagable>说它不必是一个实例Damagable.这是没关系的类型扩展 Damagable.否则,编译器假定您具有Damagable 完全相同的.

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

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


上一轮编辑

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

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

public CollisionManager(List<? extends Damagable> bodies) {
Run Code Online (Sandbox Code Playgroud)

  • `?扩展 Damagable` *意味着*在 Java 通用语言中“实现 Damagable”。 (3认同)
  • 那么与ArrayList <Damageable>有何不同?Java不知道我正在传递接口并且需要它背后的具体类型吗? (2认同)