2011-01-21 2 views
4
public static void someMethod(List < ? extends BaseDto > list) { 
    for (ChildDto dto : list) { 

    } 
} 

ChildDtoはBaseDtoを拡張しています。ここでは、ChildDtoでいっぱいのリストを確認しています。ジェネリックをループでキャストするにはどうすればよいですか?

私はこの

for (TextApplicationDto dto : (List<TextApplicationDto>)list) { 

ような何かを行うことができます知っていますが、それはかなり見ていません。

キャスティングを行う方法はありますか?

+3

私の意見では、それはかなりではありません - キャストを避ける必要がありますので、あなたのコードの型安全性が低くなります。キャストが醜いように見えるとき、あなたはそれを使用する傾向がありません。 – Jesper

+1

IMHO、このようにキャストすべきではありません。そのようなキャストは正当な理由で警告を発する。ガブゾのようにすると、私の方がはるかに良く見えます。 – maaartinus

答えて

8

私は最善の方法があることだと思う:

public static void someMethod(List < ? extends BaseDto > list) { 
    for (BaseDto dto : list) { 
     ChildDto taDTO = (ChildDto)dto; 
     // Whatever 
    } 
} 

それはまた、あなたがそれを確認するためにinstanceofを使用することができますリストだけが含まれていますChildDto

3

ChildDtoBaseDto延びており、ここで私は確信しているそのChildDtoの完全なリスト。

なぜ、そのメソッドの引数型がその知識を表していないのですか?

List<ChildDto>またはさらにList<? extends ChildDto>である必要があります。

キャスト方法は1つの解決方法ですが、返された各値を単独でキャストすることもできます。どちらも、その中で、彼らがでほぼ同じ位置を失敗する均等に「素敵」です:

for (BaseDto bDto : list) 7 
    ChildDto dto = (ChildDto) bDto; 
    // ... 
} 
+0

リストを渡さなければならないので、リスト<をキャストできないというコンパイルエラーが表示されます。 BaseDto>を多くの場所でリストに拡張します。私はそのクラスのキャスティングに取り組みたいと思っています。リスト<? extends BaseDto>は常にChildDtoのListですが、このメソッドでは常に常にです。 – IAdapter