32

レビューのために、誰かがこれが機能しない理由を簡単に説明できますか(コンパイル時):

private HashSet data;

...

public DataObject[] getDataObjects( )
{
    return (DataObject[]) data.toArray();
}

...そして、これが機能する方法は次のとおりです。

public DataObject[] getDataObjects( )
{
    return (DataObject[]) data.toArray( new DataObject[ Data.size() ] );
}

これを可能にするキャスティング(またはそれが何であれ)で機能するメカニズムについては明確ではありません。

4

3 に答える 3

40

オブジェクトの配列を作成するため、キャストするだけで はtoArray()作成できません。の配列を作成します。Object[]DataObject[]toArray(DataObject[])DataObject

そして、そうです、これは Collections クラスの欠点であり、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

于 2008-12-27T14:19:42.077 に答える
3

意図したように配列をキャストするときに型の安全性を確保するために ( DataObject[] dataArray = (DataObject[]) objectArray;)、JVM は配列内のすべてのオブジェクトを検査する必要があるため、実際には型キャストのような単純な操作ではありません。そのため、配列インスタンスを渡す必要があると思います。これは、toArray()操作によって満たされます。

于 2008-12-27T14:20:29.750 に答える
2

ストリームと Lambda が導入された Java 8 以降では、次のことも実行できます。

オブジェクトの通常の配列をキャストする場合

Stream.of(dataArray).toArray(DataObject[]::new);

リストのキャスト用

dataList.stream().toArray(DataObject[]::new);
于 2021-04-15T19:41:22.840 に答える