2

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

PS:コードはうまく機能します、私は物事を行うためのより良い方法があるかどうかだけ興味があります。

編集:

解決策:このタイプのキャストは、将来リストを変更しないことが確実な場合にのみ行う必要があります。ただし、リストからオブジェクトを削除するときは、個々のオブジェクトをキャストすることをお勧めします。

4

3 に答える 3

7

タイプのオブジェクトをリストに追加すると、リストの内容に「違反」する可能性があるため、コンパイラは文句をSomeBaseClass言いList<SomeBaseClass>ますList<? extends SomeBaseClass>

Numberここでは、数字があなたの場合の例を示しますSomeBaseClass

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")最良の選択肢であると思います。

于 2010-12-18T21:29:29.517 に答える
1

あなたがやろうとしていることは安全ではありません。次の簡単な例を考えてみましょう。

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);
    }
}
于 2010-12-18T21:29:22.320 に答える
0

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

于 2010-12-18T21:29:03.417 に答える