11

我需要在java中使用反射。我知道这Class clazz会创建一个表示Class对象的变量。但是,我正在尝试使用该方法Class从 a 中引用一个对象。我的 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或超类”

另请参阅Java 泛型常见问题解答以获取更多信息:

和 Java 语言规范:

特别是,从原始类型部分:

原始类型与通配符密切相关。两者都基于存在类型。原始类型可以被认为是通配符,其类型规则故意不合理,以适应与遗留代码的交互。从历史上看,原始类型在通配符之前;它们首先在 GJ 中被介绍,并在 Gilad Bracha、Martin Odersky、David Stoutamire 和 Philip Wadler 的论文让未来安全:为 Java 编程语言添加通用性,在 ACM 对象会议论文集中进行了描述-面向编程、系统、语言和应用程序 (OOPSLA 98),1998 年 10 月。

于 2013-02-28T20:06:55.260 回答
2

首先要意识到的是,在这种情况下,“?” 不是三元运算符,而是 Java 泛型实现的一部分,并指示 Class 的类型未指定,正如其他一些答案已经解释的那样。

把关于三元运算符的问题说清楚,其实很简单。

假设您有以下 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 回答