Java - 传递接口类型的数组列表

2022-09-02 11:41:14

我有一个界面 可损坏如下

public interface Damageable {
    public void handleCollision(float impulse);
}

一个实现此接口的类,BaseObject

public class BaseObject implements Damageable

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

public class ObjectManager {    
    public ArrayList<BaseObject> bodies;

我试图做的是将ArrayList主体传递给另一个接受ArrayList的类的方法。

public CollisionManager( ArrayList<Damageable> _bodies) {
        bodies = _bodies;
}

Java不允许我做新的CollisionManager(bodies),其中body是ArrayList和BaseObject实现Damable

我试过选角。说不能从到ArrayList也尝试使用,但后来我无法调用接口中声明的方法 损坏。如何传递数组列表?ArrayList<BaseObject>Class<? extends Damageable>


答案 1

你必须明确你的泛型。因此,您必须通知编译器,您的泛型类型本身不必是泛型类型,而是可以扩展DamagableDamagable

public CollisionManager(ArrayList<? extends Damagable> bodies) {

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


根据OP的评论进行编辑

假设您有一个名为 .告诉编译器它不必是 的实例。类型扩展是可以的。否则,编译器假定您有一个确切的Damagable<? extends Damagable>DamagableDamagableDamagable

当您将其视为接口时,它没有那么有意义,因为不存在具有.但它们的工作方式基本上是相同的。DamagableDamagable

你必须记住,你使用的是Java类型,而不是类。Java的类型语法和结构不如它的类结构那么健壮。当涉及到类型时,没有概念。implements


上一轮编辑

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

因此,通过这些修订,您将拥有:

public CollisionManager(List<? extends Damagable> bodies) {

答案 2

尝试。ArrayList<? extends Damageable > _bodies

这说明您需要一个由扩展(良好实现)的 ArrayList 组成ClassDamageable