コレクションに関してはジェネリックを理解しています。しかし、Class<T>
クラスの場合はどういう意味ですか? Class
オブジェクトをインスタンス化する場合、オブジェクトは1つだけです。では、なぜT
パラメータを使用するのでしょうか。それは何を指定していますか?そして、なぜそれが必要なのですか?
answer by dasblinkenlight は、このパラメーターの主な用途の1つをすでに示しています。私が関連すると私が考えるもう1つの側面があります。そのパラメーターを使用して、特定の場所で渡すクラスの種類を制限できます。したがって、たとえば.
Class<? extends Number> cls
は、cls
がNumber
インターフェースを実装する任意のクラスであることを意味します。これは、コンパイル時に特定のエラーをキャッチするのに役立ち、クラス引数の要件をより明確にします。
おそらくジェネリックなしの場合との比較が適切です
// Java ≥5 with generics // Java <5 style without generics
Class<? extends Foo> c; Class c;
Foo t1 = c.newInstance(); Foo t1 = (Foo)c.newInstance();
Object obj; Object obj;
Foo t2 = c.cast(obj); Foo t2 = (Foo)c.cast(obj);
ご覧のとおり、対応するメソッドはT
ではなくObject
を返す必要があるため、引数としてT
を指定しないと、いくつかの明示的なキャストが必要になります。 Foo
自体がジェネリック型の引数である場合、それらのキャストはすべてオフになり、一連のコンパイラ警告が発生します。それらを抑制することはできますが、コアの問題は残ります。コンパイラは、type引数を適切に使用しない限り、これらのキャストの有効性をチェックできません。
Javaには単一のメタクラスがあります:Class
。そのインスタンス(タイプごとに1つのみ存在)はクラスとインターフェースを表すために使用されるため、Class<T>
のT
は---を参照しますtypeClass
の現在のインスタンスが表すクラスまたはインターフェースの。
クラスタイプでのジェネリックスの使用は、クラスのタイプを定義するトップです。 「クラスobj」がある場合、オブジェクトobjはCharsequenceの子のみを保持できます。これはオプションの引数です。私はしばしば '?'を入れますEclipseからの警告を回避するにはIDE特定のタイプのクラスが必要ない場合。