6

したがって、私が理解しているように、次のように、常にインターフェイスにプログラムする必要があります。

List<Integer> list = new LinkedList<Integer>();

だから、私のプログラムの後半で私は持っています:

public List<Integer> getIntegers() {
    return list;
}

public void processIntegers() {
    // I need an arraylist here
    ArrayList<Integer> list = (ArrayList<Integer>) getIntegers(); // can I do this better, without a cast?
}

ここでより良いパターンに従うことはできますか、それともキャストを避けるために何かをすることができますか?このシナリオでは、キャストは非常に醜いようです。

ありがとう。

4

1 に答える 1

7

まず、自問自答してください。なぜ ? が必要なのArrayListですか? さらに、API のクライアントはそれを気にする必要がありますか? いくつかの選択肢があります:

  • getIntegers()返品するArrayList<Integer>。犯罪じゃない

  • AbstractListコンセンサスなど、あまり強くないインターフェース要件を検討する

  • 防御コピーを作成して、次のいずれかを使用できるようにしますList

    ArrayList<Integer> list = new ArrayList<Integer>(getIntegers());
    

    instanceof既に. _getIntegers()ArrayList

言い換えれば、要件に合わせてエレガントな方法でこのキャストを回避する方法はありません。

于 2012-07-20T21:46:40.063 に答える