【问题标题】:What is the difference between Class clazz and Class<?> clazz in java?java中的Class clazz和Class<?> clazz有什么区别?
【发布时间】:2013-02-15 04:21:17
【问题描述】:

我需要在 java 中使用反射。我知道Class clazz 创建了一个代表Class 对象的变量。但是,我正在尝试使用 forName("aClassName") 方法从 String 引用 Class 对象。我的 IDE (Eclipse) 似乎更喜欢使用符号 Class&lt;?&gt; clazz 来声明变量。我在其他地方多次看到这个符号。这是什么意思?

编辑:删除了对三元运算符的引用,因为它与此问题无关。

【问题讨论】:

  • 这与三元运算符有什么关系?这里没有运算符。
  • 在这个不是三元运算符的上下文中,它是一个未绑定的通配符。

标签: java reflection ternary-operator


【解决方案1】:

首先要意识到的是,在这种情况下,“?”不是三元运算符,而是 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.";

但是,除了最简单的语句之外,最好避免使用三元运算符,以提高代码的可读性。

【讨论】:

  • 我明白了,我的印象是 ? 总是被称为三元运算符。我现在看到这是不正确的。三元运算符是常用的还是过去比较流行的功能?
  • 我会说它仍在使用,但通常会避免使用。我仍然时不时地看到它出现在代码中,所以知道如何阅读它是件好事。在极少数情况下,有更简洁的陈述可以更清楚地说明正在发生的事情。那是我唯一一次考虑在 if/else 上使用它。
【解决方案2】:

在泛型类型中,通配符 ? 表示“任何类”(因此 Class&lt;?&gt;Class 相同,但作为原始类型已正确参数化)。

【讨论】:

    【解决方案3】:

    Class 是一个原始类型 - 它基本上是一个泛型类型,您将其视为根本不了解泛型。

    Class&lt;?&gt; 是使用 未绑定通配符 的泛型类型 - 它基本上意味着“Class&lt;Foo&gt; 用于某些类型 Foo,但我不知道是什么”。

    同样,您可以使用带边界的通配符:

    • Class&lt;? extends InputStream&gt; 表示“Class&lt;Foo&gt; 用于某些类型 Foo,但我不知道只要它是 InputStream 或子类”

    • Class&lt;? super InputStream&gt; 的意思是“Class&lt;Foo&gt; 表示某种类型的 Foo,但我不知道它是 InputStream 还是超类”

    另请参阅Java Generics FAQ 以获取很多更多信息:

    还有 Java 语言规范:

    尤其是原始类型部分:

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

    【讨论】:

    • 但是,从技术上讲,原始类型和未绑定的通配符之间没有任何区别,是吗?我的意思是,除了避免编译器警告和提高代码可读性之外。
    • @Gothmog:由于处理原始类型的方式 (IIRC),在某些情况下它会影响覆盖和重载。
    • 谢谢乔恩,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多