说我有一个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();
});
}
答案 0 :(得分:10)
您的while ((ch = getchar()) != EOF) {
// Lib functions to detect upper/lower-case letters.
if (isupper(ch)) {
++upper;
} else if (islower(ch))
++lower;
}
// And to detect letter/digit type.
if (strchr("aeiouAEIOU", ch) != NULL) {
++vowel;
} else if (isalpha(ch)) {
++consonant;
} else if (isdigit(ch)) {
++digits;
}
++total;
}
类型参数是无界的,因此编译器不对保证可用的方法做任何假设(T
方法除外)。这就是为什么它找不到Object
方法的原因。
具有draw
方法的类是否继承自声明了draw
方法的某些超类或接口?如果没有,请创建该界面,例如draw
。
然后将参数Drawable
更改为data
类型,以便您可以传入List<? extends Drawable>
或例如List<Drawable>
。
如果相反,您必须使用类型参数List<DrawableSubclass>
,则将T
(假设它在类中)声明为T
。
无论哪种方式,T extends Drawable
中的所有内容都将是List
,因此,编译器知道该列表中的任何对象都将具有Drawable
方法。