2016-03-21 6 views
-1

私はこのコードをテストした:コレクションでInteger []にキャストする必要がありますが、コレクション<Object>ではどうしてですか?

Collection l = new ArrayList<Object>(); 
    l.add(5); 
    l.add(2); 
    l.add(6); 

    Integer[] a=l.toArray(new Integer[0]);//this requires casting to Integer[] 

も、このコードを見て:最初のキャストが必要ですが、2番目ない理由

Collection<Object> l = new ArrayList<Object>(); 
    l.add(5); 
    l.add(2); 
    l.add(6); 

    Integer[] a=l.toArray(new Integer[0]);//this doesn't require casting to Integer[] 

最初の質問は

のですか?

2番目の質問は、配列のサイズ

である私たちは、クラス名を渡すか、または他の方法ではありません、なぜ何の役割も重要ではありません?このようにAPIをする理由は何ですか?

+0

でも問題はありません。これはコレクションにとって魅力的です。最初のコードではキャストが必要ですが、2番目のキャストでは不要です – Sarkhan

+0

これは生のタイプを使用しているために発生します。生の型は使用しないでください。問題が解決しました。 – Radiodef

+0

@Serkhan私の答えを受け入れてくれてありがとう。私はそれ以来、キャストを説明するためにそれを修正しました。 Radiodefは正しいですが、あなたは本当にこれについて心配する必要はありません。 –

答えて

1

最初の質問はthis questionに関連しています。ジェネリック型はJava 5まで言語に導入されていなかったので、未加工の型は以前のコードとの互換性が許されていました。 Raw型は、メソッドシグネチャと戻り型のすべてのジェネリック型情報を無視するだけで動作します。このため、生の型を使用する場合、toArrayの戻り値の型はではなくObject[]と見なされます。それがキャストが必要な理由です。

第2の問題の前提には欠陥があります。 のサイズはとなります。なぜなら、配列がコレクションのすべての要素を保持するのに十分な大きさであれば、渡された実際の配列が塗りつぶされるからです。渡された配列が小さすぎる場合にのみ、同じ型の新しい配列が作成されます。

あなたはそれを持っているtoArrayの引数に可能であったであろうことを正しいものはタイプClass<T>ではなくT[]を持っていますが、実際のバージョンは、それを再利用する配列を可能にするという利点を有します。

+0

私は彼らが ' T [] toArray(Class )'オーバーロードを提供したかったです。そしてJava 8では、 ' T [] toArray(IntFunction )'オーバーロードを提供することができましたが、そうではありませんでした。彼らはJava 8のインターフェースに他のものを追加しました。 – Radiodef

+1

@Radiodef私は同意します。 'toArray'は完全な混乱です。 –

関連する問題