web-dev-qa-db-ja.com

クラスClass <T>の一般的な性質はどういう意味ですか? Tとは

コレクションに関してはジェネリックを理解しています。しかし、Class<T>クラスの場合はどういう意味ですか? Classオブジェクトをインスタンス化する場合、オブジェクトは1つだけです。では、なぜTパラメータを使用するのでしょうか。それは何を指定していますか?そして、なぜそれが必要なのですか?

45
Tim

answer by dasblinkenlight は、このパラメーターの主な用途の1つをすでに示しています。私が関連すると私が考えるもう1つの側面があります。そのパラメーターを使用して、特定の場所で渡すクラスの種類を制限できます。したがって、たとえば.

Class<? extends Number> cls

は、clsNumberインターフェースを実装する任意のクラスであることを意味します。これは、コンパイル時に特定のエラーをキャッチするのに役立ち、クラス引数の要件をより明確にします。

おそらくジェネリックなしの場合との比較が適切です

// 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引数を適切に使用しない限り、これらのキャストの有効性をチェックできません。

8
MvG

Javaには単一のメタクラスがあります:Class。そのインスタンス(タイプごとに1つのみ存在)はクラスとインターフェースを表すために使用されるため、Class<T>Tは---を参照しますtypeClassの現在のインスタンスが表すクラスまたはインターフェースの。

1
Óscar López

クラスタイプでのジェネリックスの使用は、クラスのタイプを定義するトップです。 「クラスobj」がある場合、オブジェクトobjはCharsequenceの子のみを保持できます。これはオプションの引数です。私はしばしば '?'を入れますEclipseからの警告を回避するにはIDE特定のタイプのクラスが必要ない場合。

0
Eldius