レビューのために、誰かがこれが(コンパイル時に)動作しない原因をすばやく説明できますか?
private HashSet data;
...
public DataObject[] getDataObjects( )
{
return (DataObject[]) data.toArray();
}
...そして、これが機能する方法を何にするのか:
public DataObject[] getDataObjects( )
{
return (DataObject[]) data.toArray( new DataObject[ Data.size() ] );
}
これを可能にするキャスティング(またはそれが何であれ)で機能しているメカニズムは明確ではありません。
なぜならtoArray()
、オブジェクトの配列を作成し、それをキャストObject[]
するDataObject[]
だけでは作ることができないからです。toArray(DataObject[])
の配列を作成しますDataObject
。
そして、はい、これはコレクションクラスの欠点であり、GenericsがJavaに組み込まれた方法です。あなたはCollection<E>.toArray()
それがEの配列を返すことができると期待するでしょうが、そうではありません。
toArray(DataObject[])
呼び出しについて興味深いこと: "a"配列を十分に大きくする必要がないので、必要に応じてそれを呼び出すことがtoArray(new DataObject[0])
できます。
後で配列の長さを取得toArray(new DateObject[0])
する場合は、このように呼び出す方が実際には優れています.length
。初期の長さが大きく、渡した同じ配列オブジェクトが返された場合、NullPointerException
後でsに直面する可能性があります
以前にJavaジェネリックスについて質問したところ、非常に役立つこのFAQが指摘されました。http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加