QA@IT

Javaで共通の型から派生した異なる型のオブジェクトを管理する ArrayListリストそれぞれから共通の型のメンバにアクセスしたい

2822 PV

Javaで、ArrayListクラスを使って、クラスAから派生したクラスB、クラスCのオブジェクトを取り扱うリストB(BArray)、リストC(CArray)を実装したいと考えています。リストBとリストCには、それぞれクラスBとクラスCの固有のメンバをアクセスするメソッドを追加しますが、それとは別に、クラスAのメンバを使う共通のメソッドを実装するにはどうすればいいのでしょうか?
やりかたがわからなかったので、リストBとリストCそれぞれに同じメソッドを追加しましたが、これはきれいなコードではありません。

public class A{
    public int keyID;
}

public class B extends A{
    public int valA;
}

public class C extends A{
    public int valB;
}

public class BArray extends ArrayList<B>{
    public int findIndex(int keyID){
        for(int i=0;i<this.size();i++){
            if(this.get(i).keyID==keyID){
                return i;
            }
        }
        return -1;
    }
}

public class CArray extends ArrayList<C>{
    public int findIndex(int keyID){
        for(int i=0;i<this.size();i++){
            if(this.get(i).keyID==keyID){
                return i;
            }
        }
        return -1;
    }
}

ArrayListから派生した別のクラス(CommonArray)にこのメソッドを記述し、そのクラスを派生してリストB、リストCを定義するのがきれいなのかと思いましたが、クラスAの共通メンバにアクセスするという時点で、そういう記述ができるのかどうかわからなくなりました。
上記の方法を使わずに、リストB、リストCからクラスAのメンバを処理する共通の関数を一箇所に記述する方法を教えてください。

それが無理ならば、ArrayListで管理するオブジェクトのクラスをAに統一して、オブジェクトの追加や参照をキャストしながら行なうようにしようと考えていますが、キャストを多用することになるので、できれば避けたいと思っています。

(代替案)

public class A{
    public int keyID;
}

public class B extends A{
    public int valA;
}

public class C extends A{
    public int valB;
}

public class CommonArray extends ArrayList<A>{
    public int findIndex(int keyID){
        for(int i=0;i<this.size();i++){
            if(this.get(i).keyID==keyID){
                return i;
            }
        }
        return -1;
    }
}

public class BArray extends CommonArray{
}

public class CArray extends CommonArray {
}

以上、よろしくお願いします。

回答

以下のようにします。

public class A{
    public int keyID;
}

public class B extends A{
    public int valA;
}

public class C extends A{
    public int valB;
}

public class CommonArray<T extends A> extends ArrayList<T>{
    public int findIndex(int keyID){
        for(int i=0;i<this.size();i++){
            if(this.get(i).keyID==keyID){
                return i;
            }
        }
        return -1;
    }
}

public class BArray extends CommonArray<B> {
}

public class CArray extends CommonArray<C> {
}
編集 履歴 (0)
  • ありがとうございます。総称型にもextendsをつけられるとは、全く思い浮かびませんでした。大変参考になりました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。