私の質問は上記のとおりです。申し訳ありませんが、おそらく重複しています<?>
が、最後にが付いている例は見つかりませんでした。
なぜClass
パラメータとして使用しないのですか?
私の質問は上記のとおりです。申し訳ありませんが、おそらく重複しています<?>
が、最後にが付いている例は見つかりませんでした。
なぜ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
Class
タイプなしで単に使用するよりもこれを行う利点は何ですか?彼らは同じことを表しているようです。
?
ワイルドカードを指定している」と伝える以外の利点はありません。 。ワイルドカードを指定しない場合、コンパイラは、型を忘れたか、クラスがジェネリックであると知らなかったと想定し、警告を表示します。
Class<?>
Class
タイプがClass<?>
である引数に単純に渡すことはできないので Class<?>
、すべての状況でより便利です。
これ<?>
は獣です。多くの場合、混乱やエラーが発生します。なぜなら、最初にそれを目にして、次に信じ始めると、あらゆる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つのタイプしか保存できません。確かに、これは実際のタイプではありません。
これは、クラス参照が任意のクラスオブジェクトへの参照を保持できることを意味します。
基本的には「クラス」と同じですが、コードを読んだ他の人にジェネリックを忘れていないことを示しています。必要なのは、任意のクラスオブジェクトを保持できる参照だけです。
Bruce Eckel、Thinking in Java:
Java SE5では、Class <?>が同等であり、プレーンクラスがコンパイラ警告を生成しない場合でも、プレーンクラスよりも優先されます。Class <?>の利点は、非特定のクラス参照を誤って使用したり、無知であったりしないことを示しています。非特定バージョンを選択しました。