我需要在java中使用反射。我知道Class clazz
创建了一个表示Class
对象的变量。但是,我尝试使用Class
方法从String
引用forName("aClassName")
对象。我的IDE(Eclipse)似乎更喜欢用符号Class<?> clazz
来声明变量。我在其他地方多次看过这种表示法。这是什么意思?
编辑:删除了对三元运算符的引用,因为它与此问题无关。
答案 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
相同,但原始类型正确参数化)。