スーパークラスのリストにキャストするときにJavaでチェックされていないキャスト
-
11-10-2019 - |
質問
私の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);
}
}
あなたはダウンキャスティングです、これは悪い習慣です。このキャストを避けるために、コードをリファクタリングしてください。そしてもちろん、この場合は警告を抑制してはいけません。