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

时间:2019-01-25 00:41:34

标签: java generics instance

说我有一个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();
    });
}

1 个答案:

答案 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方法。