スーパークラスのリストにキャストするときにJavaでチェックされていないキャスト

StackOverflow https://stackoverflow.com/questions/4480224

質問

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

PS:コードは正常に動作しますが、私は物事を行うより良い方法があるかどうか興味があります。

編集:

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

役に立ちましたか?

解決

タイプのオブジェクトを追加する場合、不平を言う 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") ここであなたの最良の選択肢です。

他のヒント

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

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);
    }
}

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top