11

Javaでリフレクションを利用する必要があります。Class clazzオブジェクトを表す変数が作成されることを理解していClassます。ただし、メソッドを使用してClassからオブジェクトを参照しようとしています。私のIDE(Eclipse)は、変数を宣言するための表記法を好むようです。私はこの表記を他の場所で何度も見ました。これは何を意味するのでしょうか?StringforName("aClassName")Class<?> clazz

編集:この質問に関連しないため、三項演算子への参照を削除しました。

4

3 に答える 3

27

Class生の型です-基本的には、ジェネリックについてまったく知らないかのように扱っているジェネリック型です。

Class<?>は、バインドされていないワイルドカードを使用するジェネリック型です。これは、基本的に「Class<Foo>ある型については、何を意味するのFooかわかりません」という意味です。

同様に、境界のあるワイルドカードを使用できます。

  • Class<? extends InputStream>Class<Foo>「ある種のタイプですが、それがサブクラスFooである限り、私にはわかりません」という意味です。InputStream

  • Class<? super InputStream>Class<Foo>「ある種のタイプですが、それがスーパークラスFooである限り、私にはわかりません」という意味です。InputStream

詳細については、JavaGenericsFAQも参照しください

そしてJava言語仕様:

特に、rawタイプのセクションから:

Raw types are closely related to wildcards. Both are based on existential types. Raw types can be thought of as wildcards whose type rules are deliberately unsound, to accommodate interaction with legacy code. Historically, raw types preceded wildcards; they were first introduced in GJ, and described in the paper Making the future safe for the past: Adding Genericity to the Java Programming Language by Gilad Bracha, Martin Odersky, David Stoutamire, and Philip Wadler, in Proceedings of the ACM Conference on Object-Oriented Programming, Systems, Languages and Applications (OOPSLA 98), October 1998.

于 2013-02-28T20:06:55.260 に答える
2

最初に気付くのは、この場合は「?」です。は三項演算子ではありませんが、Javaのジェネリック実装の一部であり、他の回答のいくつかですでに説明されているように、クラスのタイプが指定されていないことを示します。

三項演算子についての質問を明確にするために、それは実際には非常に簡単です。

次のifステートメントがあるとします。

boolean correct = true;
String message;

if (correct) {
  message = "You are correct.";
} else {
  message = "You are wrong.";
}

三項演算子を使用してこれを書き直すことができます(if-else-shortcut演算子と考えてください)。

message = (correct) ? "You are correct." : "You are wrong.";

ただし、コードの可読性を向上させるために、最も単純なステートメントを除くすべてのステートメントで三項演算子を使用しないことをお勧めします。

于 2013-02-28T20:15:38.537 に答える
0

ジェネリック型では、ワイルドカード?は「すべてのクラス」を意味します(つまり、生の型が正しくパラメーター化されClass<?>ているのと同じです)。Class

于 2013-02-28T20:08:57.587 に答える