2012-07-20 6 views
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? 
} 

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

ありがとうございました。

+1

また、なぜこれがより良いのか、最終的にキャストが避けられない場合、常にarrayListを使用しているかと尋ねます。 – dontcare

+0

@dontcareこの整数リストは、特にarraylistではなく、リストを受け入れる汎用関数に渡すことができます。 – jn1kk

+0

あなたは離れて逃げることのできる最小限の特定のタイプにプログラムする必要があります。 – plasma147

答えて

7

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

  • getIntegers()リターンArrayList<Integer>を作ります。犯罪ではありません。

  • あなたはどんなListを消費することができるようにコンセンサス

  • としてAbstractListは守備のコピーを作成します。getIntegers()はすでにArrayListある場合

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

    は、不要なコピーを避けるためにinstanceof演算子を使用することを検討してください。

他の言葉で言えば、あなたの要件とエレガントな方法でこのキャスティングを避ける方法はありません。

関連する問題