10

Class.forName()ユーザーの入力に基づいてクラス インスタンスを動的に作成するためにJava リフレクション (つまり ) を使用するプログラムを作成しています。要件の 1 つは、プログラムが作成するインスタンスが、私が定義した it と呼ばれる特定のクラスを拡張する必要があることSomeClassです。私の質問は次のとおりです。このクラス型を格納するには、境界付きジェネリックを使用する必要がありますかClass<? extends SomeClass>、それとも単純に制限なしジェネリックを使用する必要がありClassますか? クラスは無制限のワイルドカードジェネリックを使用するための優れたプラクティスの 1 つだと言っている Java の本をいくつか見つけましたが、これが私のプログラムの状況に当てはまるかどうか疑問に思っています。

私の質問が十分に明確でない場合や、情報が必要な場合は、お気軽にお知らせください。

4

1 に答える 1

17

Class<? extends SomeClass>それがジェネリックの目的であるため、使用する必要があります。

を呼び出すときに、それが新しいクラスClass.forNameかどうかを確認します。それ以外の場合は、またはSomeClass.class.isAssignableFromをスローする必要があります。IllegalArgumentExceptionClassCastException

編集:または、呼び出しasSubclass(SomeClass.class)によってこれが行われます。

例えば:

public SomeClass instantiate(String name)
  throws ClassNotFoundException, InstantiationException, IllegalAccessException {

    Class<?> raw = Class.forName(name);

    //throws ClassCastException if wrong
    Class<? extends SomeClass> generic = raw.asSubclass(SomeClass.class);

    // do what you want with `generic`

    return generic.newInstance();
}
于 2013-06-06T18:55:12.937 に答える