web-dev-qa-db-ja.com

JavaではClass <?>はどういう意味ですか?

私の質問は上記のとおりです。申し訳ありませんが、おそらく重複していますが、最後に<?>を含む例を見つけることができませんでした。

パラメータとしてClassを使用しないのはなぜですか?

119
david99world

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

94
manub

この<?>は獣です。多くの場合、混乱とエラーにつながります。最初に表示されたときに、<?>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つのタイプのみです。確かに実際のタイプではありません。

58
Andreas_D

これは、クラス参照が任意のクラスオブジェクトへの参照を保持できることを意味します。

基本的には「クラス」と同じですが、ジェネリックについて忘れていないコードを読んでいる他の人に見せているので、クラスオブジェクトを保持できる参照が必要です。

ブルース・エッケル、Javaで考える:

Java SE5では、Class <?>は同等であり、見たようにプレーンクラスはコンパイラ警告を生成しませんが、プレーンクラスよりも優先されます。 Class <?>の利点は、偶然または無知によって、特定でないクラス参照を使用しているだけではないことを示していることです。非特定バージョンを選択しました。

6
Filip

generics リテラルです。これは、このClassインスタンスが表すクラスのタイプがわからないが、まだ汎用バージョンを使用していることを意味します。

  • クラスを知っていれば、Class<Foo>を使用します。そのようにして、たとえば、キャストせずに新しいインスタンスを作成できます:Foo foo = clazz.newInstance();
  • ジェネリックをまったく使用しない場合は、少なくとも警告が表示されます(そして、ジェネリックを使用しないと、検出が困難な副作用につながる可能性があるため、一般的に推奨されません)
5
Bozho

ジェネリックでは、不明なタイプはワイルドカード文字「?」で表されます。公式の例については here をお読みください。

4
Jasonw

これは、任意のタイプ(不明)のクラスを意味します。

Javaジェネリックチュートリアルを読んで、理解を深めてください。

3
fmucar