如何从通用对象调用实例方法?

swy*_*veu 6 java generics instance

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

以下不起作用.我明白为什么.Java不知道该项具有这样的功能.我怎么能绕过这个?

public void drawItems(ArrayList<T> data) 
{
    data.forEach((T item) -> {
        item.draw();
   }); 
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

谢谢大家.我做了如下:

1)创建名为Drawable的接口:

public interface Drawable {
    public void draw();
}
Run Code Online (Sandbox Code Playgroud)

2)将接口实现为Item类:

public class Item implements Drawable { 

    @Override
    public void draw(GraphicsContext gc) {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

3)调整drawItems:

public void drawItems(ArrayList<Drawable> data) {

    data.forEach((Drawable item) -> {
        item.draw();
    });
}
Run Code Online (Sandbox Code Playgroud)

rge*_*man 10

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

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

然后将参数更改data为类型List<? extends Drawable>,这样您就可以传入一个List<Drawable>或者例如一个List<DrawableSubclass>.

相反,你必须使用type参数T,声明T(我假设它在类上)T extends Drawable.

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