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)
| 归档时间: |
|
| 查看次数: |
18761 次 |
| 最近记录: |