質問

ここに私のコードは次のとおりです。

Object[] data = GeneComparison.readData(files);
MyGenome genome = (MyGenome) data[0];
LinkedList<Species> breeds = (LinkedList<Species>) data[1];

これは、LinkedListのためにこの警告を与えます:

Type safety: Unchecked cast from Object to LinkedList<Species>

なぜそれがMyGenomeリンクリストに文句を言うとしないのですか?

役に立ちましたか?

解決

ここにいるのでます:

MyGenome genome = (MyGenome) data[0];

あなたはジェネリックを使用していない

そして、ここで

LinkedList<Species> breeds = (LinkedList<Species>) data[1];

あなたはそれらを使用しています。

それはあなたがデータ配列に型を混合している、単なる警告です。あなたは何をしているかわかっている場合は、警告を無視することができます。

(第2要素やるが含まれている場合、私はのLinkedListはの意味します)

しかし、より良いが、このようなオブジェクトを持っているだろう

class Anything {
    private Object [] data;
    public Anything( Object [] data ) {
         this.data = data;
    }
    public Gnome getGnome() {
    .....
    }
    public List<Species> getBreeds() {
    ......
    }
 }

そして、あなたがで終わるように、前に正しい変換に、適切なものを返すメソッドを持っています:

Anything anything = new Anything( GeneComparison.readData(files) );
MyGenome genome             = anything.getGnome(); // similar to data[0]
LinkedList<Species> breeds = anything.getBreeds(); // similar to data[1];

あなたは適切な変換を行う必要があり、これらのメソッド内。

他のヒント

あなたはパラメータ化タイプ(LinkedListの)に非パラメータ化された型(Object)をキャストすると

Javaはそのように文句を言います。それは何もすることができることをあなたに伝えます。それは実際にそれがそのタイプが、2番目はないでしょうでない場合、最初はClassCastExceptionが発生しますを除いて、第1のキャストと何ら変わりません。

これは、すべてのタイプの消去にダウンしています。実行時にLinkedListのは、本当にただLinkedListのです。あなたはそれで何かを置くことができ、それが最初の例のようにClassCastExceptionが発生しません。

は、多くの場合、あなたのような何かをする必要があり、この警告を取り除くために

@SuppressWarning("unchecked")
public List<Something> getAll() {
  return getSqlMapClient.queryForList("queryname");
}

queryForListは()を使用すると、内容がクラスの何かであることがわかっているリスト(非パラメータ化)を返します。

これまで他の態様は、Javaにおける配列は、それらが実行時型情報を保持意味の共変のであることです。たとえばます:

Integer ints[] = new Integer[10];
Object objs[] = ints;
objs[3] = "hello";

例外がスローされます。しかします:

List<Integer> ints = new ArrayList<Integer>(10);
List<Object> objs = (List<Object>)ints;
objs.add("hello");

完全に合法です。

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