どのように私は一般的なオブジェクトからインスタンスメソッドを呼び出すことができますか?

swyveu:

私はそれらのすべてが同じメソッド持つ、異なるクラスのアイテムを含むArrayListを持っていると言う:(描画)を、私は、パラメータとしてArrayListを取り込む方法drawItems(と第三のクラス)を有します。彼らは一般的なオブジェクトとして渡された場合さて、どのように私は、これらのオブジェクトのdraw()メソッドを呼び出すことができますか?

下記これは動作しません。私は理由を見ることができます。Javaはアイテムがこのような機能を持って知りません。どのように私はこの問題を回避することができますか?

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

更新

みんなありがとう。次のように私はそれをやりました:

1)Drawableの名前のインターフェイスを作成します。

public interface Drawable {
    public void draw();
}

2)項目クラスにインターフェースを実装します

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();
    });
}
rgettman:

あなたのTコンパイラは(を除いて利用可能であることを保証する方法に関する仮定行うものではありませんので、typeパラメータは、無制限であるObject方法を)。それは見つけることができない理由ですdraw方法を。

持っているあなたのクラスですかdraw宣言して、いくつかのスーパークラスまたはインタフェースからメソッドを継承draw方法を?そうでない場合、例えば、そのインターフェイスを作成しますDrawable

次に、パラメータを変更するdataタイプであることをList<? extends Drawable>、あなたが渡すことができますList<Drawable>か例えば、A List<DrawableSubclass>

代わりに、あなたはtypeパラメータを使用する必要がある場合T、宣言Tであることを(私はそれがクラス上だと仮定しています)T extends Drawable

どちらにしても、上限で、中にすべてがListなりDrawable、コンパイラはそのリスト内の任意のオブジェクトが持っていることを知っているので、drawこの方法を。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=173082&siteId=1