Java 中的 Class clazz 和 Class<?> clazz 有什么区别?



我需要利用java中的反射。我理解Class clazz创建了一个代表Class对象的变量。但是,我试图使用forName("aClassName")方法从String引用Class对象。我的IDE (Eclipse)似乎更喜欢用Class<?> clazz来声明变量。我在其他地方见过很多次这个符号。这是什么意思?

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

Class是一个原始类型 -它基本上是一个泛型类型,你对待它就好像你根本不知道泛型。

Class<?>是使用未绑定通配符的泛型类型-它基本上表示"Class<Foo>用于某些类型Foo,但我不知道是什么"。

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

  • Class<? extends InputStream>意味着" Class<Foo>对于某些类型的Foo,但我不知道什么,只要它是InputStream或子类"

  • Class<? super InputStream>的意思是"Class<Foo>对于某些类型的Foo,但我不知道什么,只要它是InputStream或超类"

关于的更多信息,请参见Java泛型FAQ:

    原始类型
  • 通配符

和Java语言规范:

  • 原始类型(第4.8节)
  • 类型参数和通配符(4.5.1节)

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

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

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

为了澄清有关三元操作符的问题,实际上很简单。

假设你有下面的if语句:

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

你可以用三元操作符重写它(把它看作if-else-快捷操作符):

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

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

在泛型中,通配符?表示"任何类"(因此Class<?>Class相同,但作为正确参数化的原始类型)。

相关内容

  • 没有找到相关文章

最新更新