2013-06-06 12 views
10

私は、Javaリフレクション(つまり、Class.forName())を使用して、ユーザーの入力に基づいてクラスインスタンスを動的に作成するプログラムを作成しています。 1つの要件は、私のプログラムが作成するインスタンスは、それがSomeClassと呼ばれる定義された特定のクラスIを拡張しなければならないということです。私の質問は:このクラス型を格納するために、私は束縛されたジェネリック、Class<? extends SomeClass>、または単に無制限のジェネリック、Classを使うべきですか?クラスが無制限のワイルドカードジェネリックを使用するための良い方法の1つであると言うJavaの書籍があることがわかりましたが、これがプログラムの状況に当てはまるかどうかは疑問です。Java Generics - クラスまたはクラス<? extends SomeClass>

私の質問が十分ではないか、いくつかの情報が必要であることがわかった場合は、私に知らせてください。

答えて

16

Class<? extends SomeClass>を使用する必要があります。その理由はジェネリックスのためです。

Class.forNameを呼び出すときに、それがSomeClass.class.isAssignableFrom新しいクラスであるかどうかを確認してください。それ以外の場合はIllegalArgumentExceptionまたはClassCastExceptionを投げてください。

EDIT:また、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(); 
} 
+0

@Vulcanはい、それはどのようなOP指定されていないのです。彼は彼らに「SomeClass」を広げてほしい。 – wchargin

+3

['asSubclass'](http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#asSubclass \(java.lang.Class \))を使用すると、 'isAssignableFrom'をチェックしてから例外をスローするのではなく)。 –

+1

また、チェックされていないキャストの正当性はまだありません。あなたのヘルパーメソッドは 'SomeClass'を返すだけでジェネリックではないはずです。 –