私の質問は上記のとおりです。申し訳ありませんが、おそらく重複していますが、最後に<?>
を含む例を見つけることができませんでした。
パラメータとしてClass
を使用しないのはなぜですか?
Class
はパラメーター化可能なクラスです。したがって、Class<T>
という構文を使用できます。ここで、T
はタイプです。 Class<?>
と記述することにより、任意のタイプのClass
オブジェクトを宣言します(?
はワイルドカードです)。 Class
タイプは、クラスに関するメタ情報を含むタイプです。
Class<?>
を使用して、特定の型を指定してジェネリック型を参照することは常に推奨されるプラクティスです。このプラクティスを尊重しています(Class
はパラメーター化可能であることを認識しています)。パラメータに特定のタイプを指定します。
ジェネリックとワイルドカードに関するリファレンス: http://docs.Oracle.com/javase/tutorial/Java/generics/wildcards.html
Class
オブジェクトとリフレクションに関するリファレンス(Java言語自体のイントロスペクションに使用される機能): https://www.Oracle.com/technetwork/articles/Java/javareflection- 1536171.html
この<?>
は獣です。多くの場合、混乱とエラーにつながります。最初に表示されたときに、<?>
はany Java type。それは本当ではありません。 <?>
は未知のタイプであり、わずかで厄介な違いです。
Class
で使用する場合は問題ありません。両方の行が機能し、コンパイルされます。
Class anyType = String.class;
Class <?> theUnknownType = String.class;
ただし-コレクションで使用を開始すると、奇妙なコンパイル時エラーが表示されます。
List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed
list.add("a String"); // doesn't compile ...
List<?>
はコレクションではなく、あらゆるタイプのオブジェクトに適しています。格納できるのは、神秘的な「未知のタイプ」という1つのタイプのみです。確かに実際のタイプではありません。
これは、クラス参照が任意のクラスオブジェクトへの参照を保持できることを意味します。
基本的には「クラス」と同じですが、ジェネリックについて忘れていないコードを読んでいる他の人に見せているので、クラスオブジェクトを保持できる参照が必要です。
ブルース・エッケル、Javaで考える:
Java SE5では、Class <?>は同等であり、見たようにプレーンクラスはコンパイラ警告を生成しませんが、プレーンクラスよりも優先されます。 Class <?>の利点は、偶然または無知によって、特定でないクラス参照を使用しているだけではないことを示していることです。非特定バージョンを選択しました。
generics リテラルです。これは、このClass
インスタンスが表すクラスのタイプがわからないが、まだ汎用バージョンを使用していることを意味します。
Class<Foo>
を使用します。そのようにして、たとえば、キャストせずに新しいインスタンスを作成できます:Foo foo = clazz.newInstance();
ジェネリックでは、不明なタイプはワイルドカード文字「?」で表されます。公式の例については here をお読みください。
これは、任意のタイプ(不明)のクラスを意味します。
Javaジェネリックチュートリアルを読んで、理解を深めてください。