私はそれらのすべてが同じメソッド持つ、異なるクラスのアイテムを含む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();
});
}
あなたの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
この方法を。