Class clazz和java中的Class <! - ? - > clazz有什么区别?

时间:2013-02-28 20:04:49

标签: java reflection ternary-operator

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

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

3 个答案:

答案 0 :(得分:24)

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

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

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

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

  • Class<? super InputStream>对某些类型Class<Foo>表示“Foo,但我不知道只要它是InputStream或超类”

另请参阅Java Generics FAQ了解 lot 的更多信息:

Java语言规范:

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

  

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

答案 1 :(得分: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.";

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

答案 2 :(得分:0)

在泛型类型中,通配符?表示“无论什么类”(因此Class<?>Class相同,但原始类型正确参数化)。