首页 > 解决方案 > 如何从通用对象调用实例方法?

问题描述

假设我有一个 arrayList 包含不同类的项目,它们都具有相同的方法:draw(); 我有一个带有方法 drawItems() 的第三个类,它将 arrayList 作为参数。现在,如果这些对象作为通用对象传递,我该如何调用这些对象的 draw() 方法?

下面这行不通。我明白为什么了。Java 不知道该项目具有这样的功能。我怎样才能解决这个问题?

public void drawItems(ArrayList<T> data) 
{
    data.forEach((T item) -> {
        item.draw();
   }); 
}

更新

谢谢大家。我这样做如下:

1)创建名为Drawable的接口:

public interface Drawable {
    public void draw();
}

2)在Item类中实现接口:

public class Item implements Drawable { 

    @Override
    public void draw(GraphicsContext gc) {
        //...
    }
}

3)调整drawItems:

public void drawItems(ArrayList<Drawable> data) {

    data.forEach((Drawable item) -> {
        item.draw();
    });
}

标签: javagenericsinstance

解决方案


您的T类型参数是无界的,因此编译器不会对保证可用的方法做出任何假设(Object方法除外)。这就是它找不到draw方法的原因。

具有该draw方法的类是否继承自某个声明该draw方法的超类或接口?如果没有,请创建该接口,例如Drawable.

然后将参数更改data为 type List<? extends Drawable>,这样您就可以传入 aList<Drawable>或例如 a List<DrawableSubclass>

相反,如果您必须使用类型参数T,请声明T(我假设它在类上)为T extends Drawable.

无论哪种方式,使用上限,Listwill 中的所有内容都是Drawable,因此编译器知道该列表中的任何对象都将具有draw方法。


推荐阅读