2010-12-18 14 views
2

私のJavaプログラムでは、List<? extends SomeBaseClass>のオブジェクトをList<SomeBaseClass>にキャストする必要があります。私が直接キャストすると、コンパイラはチェックされていないキャストがあることを警告(警告を表示)します。すべてのオブジェクトをスーパークラスに変換できることは確かですが、コンパイラはそれに気付かず、チェックされていないキャストを報告します。どのように警告を取り除くことができますか? @SupressWarnings( "未チェック")以外の方法はありますか?スーパークラスのリストにキャストするときのチェックされていないキャスト

P .:コードはうまく動作します。私は物事を行う良い方法があるかどうか不思議です。

編集:

ソリューション:彼は、彼は将来的にリストを変更しないと確信している場合は、1つだけのキャストのこのタイプを行う必要があります。しかし、個々のオブジェクトをキャストするときは、キャストすることをお勧めします。

+1

一般的に、ワイルドカードタイプを返さないことで、これらの変換の必要性を減らすことができます。ワイルドカード型を引数として取るメソッドの中では、ワイルドカード(Iterator変数など)を繰り返す必要がある場所はほとんどなくてはなりません。実際にワイルドカードを繰り返すので、誤ってリストに追加することはありません未知のサブタイプです。 –

答えて

7

:この単純な例を考えてみましょう。ここでは例の

あなたSomeBaseClassとしてNumber数字はとき:

List<? extends Number> doubles = new ArrayList<Double>(); 
List<Number> nums = (List<Number>) doubles; 

nums.add(new Integer(5)); // no compiler complaints here... 

// doubles now contains an Integer value! 

あなたのケースでは、この周りに方法がない場合、私は@SuppressWarnings("unchecked")ここにあなたの最良の選択肢であると考えています。

+0

何が間違っているのか分かりました。ありがとうございました。私はそれを修正する方法も知っています。リストを使って歩いていました。何も追加していないので、元のタイプのコレクションを保持できます。このような繰り返しの間のすべて:for(Number n:double) – k21

-1

あなたはダウンキャストしていますが、これは悪い習慣です。このキャストを避けるためにコードをリファクタリングしてみてください。もちろん、この場合は警告を抑止しないでください。

1

あなたがしようとしているのは、安全でないことです。あなたはList<SomeBaseClass>リストにタイプSomeBaseClassのオブジェクトを追加した場合、あなたはあなたのList<? extends SomeBaseClass>リストの内容を「違反する」可能性があるため、コンパイラは文句

import java.util.*; 

class SomeBaseClass 
{ 
} 

class SomeSubClass extends SomeBaseClass 
{ 
    public static void main(String[] a) 
    { 
     List<SomeSubClass> orig = new ArrayList<SomeSubClass>(); 
     // Compiles with no warnings. This is the purpose of the ? extends syntax 
     List<? extends SomeBaseClass> l1 = orig; 
     // This is what you're trying to do 
     List<SomeBaseClass> l2 = (List<SomeBaseClass>) l1; 
     // Then, we add a SomeBaseClass to the new list 
     l2.add(new SomeBaseClass()); 
     // ClassCastException, since this casts a SomeBaseClass to a SomeSubClass 
     SomeSubClass first = orig.get(0); 
    } 
} 
関連する問題