如何从通用对象调用实例方法?
How can I call an instance method from a generic object?
假设我有一个包含不同 classes 项目的 arrayList,它们都具有相同的方法:draw();
我有第三个 class,其方法 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) 在项目 class 中实现接口:
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();
});
}
您的 T
类型参数是无界的,因此编译器不会对保证可用的方法做出任何假设(Object
方法除外)。这就是它找不到 draw
方法的原因。
具有 draw
方法的 class 是否继承自某些声明了 draw
方法的超类class 或接口?如果没有,请创建该接口,例如Drawable
.
然后将参数 data
更改为 List<? extends Drawable>
类型,这样您就可以传入 List<Drawable>
或例如List<DrawableSubclass>
.
如果您必须使用类型参数 T
,请将 T
(我假设它在 class 上)声明为 T extends Drawable
.
无论哪种方式,有了上限,List
中的所有内容都将是 Drawable
,因此编译器知道该列表中的任何对象都将具有 draw
方法。
假设我有一个包含不同 classes 项目的 arrayList,它们都具有相同的方法:draw(); 我有第三个 class,其方法 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) 在项目 class 中实现接口:
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();
});
}
您的 T
类型参数是无界的,因此编译器不会对保证可用的方法做出任何假设(Object
方法除外)。这就是它找不到 draw
方法的原因。
具有 draw
方法的 class 是否继承自某些声明了 draw
方法的超类class 或接口?如果没有,请创建该接口,例如Drawable
.
然后将参数 data
更改为 List<? extends Drawable>
类型,这样您就可以传入 List<Drawable>
或例如List<DrawableSubclass>
.
如果您必须使用类型参数 T
,请将 T
(我假设它在 class 上)声明为 T extends Drawable
.
无论哪种方式,有了上限,List
中的所有内容都将是 Drawable
,因此编译器知道该列表中的任何对象都将具有 draw
方法。