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


回答:


109

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


7
Classタイプなしで単に使用するよりもこれを行う利点は何ですか?彼らは同じことを表しているようです。
ashes999

1
ジェネリックの全体のポイントは、クラスのタイプを事前に知らないことだと思いました。それ以外の場合は、特定のクラス型をパラメーターに使用する関数を定義するだけです。この疑問符はまだ意味がありません。
Brain2000 2015

5
コンパイラーに「これはジェネリッククラスであることはわかっていますが、実際の型がわからないので、具体的な型を指定する代わりに、?ワイルドカードを指定している」と伝える以外の利点はありません。 。ワイルドカードを指定しない場合、コンパイラは、型を忘れたか、クラスがジェネリックであると知らなかったと想定し、警告を表示します。
カヤマン

1
Kotlin相当何ですかClass<?>
JGuoは

ClassタイプがClass<?>である引数に単純に渡すことはできないので Class<?>、すべての状況でより便利です。
petertc 2018年

72

これ<?>は獣です。多くの場合、混乱やエラーが発生します。なぜなら、最初にそれを目にして、次に信じ始めると、あらゆるJavaタイプの<?>ワイルドカードになるからです。それは..真実ではありません。ある未知のタイプ、わずかなと厄介な違いが。<?>

で使用する場合は問題ありません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つのタイプしか保存できません。確かに、これは実際のタイプではありません。


8

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

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

Bruce Eckel、Thinking in Java:

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


1
引用は、「クラス<?>は普通のクラスよりも好ましい」および「クラス<?>の利点」と述べています。blockquoteが山括弧と一致しないようです。
Filip

1
エスケープする必要があります。今すぐ修正:P
Sami Kuhmonen

5

それはだジェネリックリテラル。つまり、このClassインスタンスが表すクラスのタイプはわかりませんが、まだ汎用バージョンを使用しています。

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


3

それは、何かのタイプ(不明)を持つクラスを意味します。

あなたはそれをよりよく理解するためにJavaジェネリックのチュートリアルを読むべきです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.