我的问题如上所述。抱歉,可能是重复的,但是最后找不到一个示例<?>
。
为什么不只使用它Class
作为参数?
我的问题如上所述。抱歉,可能是重复的,但是最后找不到一个示例<?>
。
为什么不只使用它Class
作为参数?
Answers:
Class
是可参数化的类,因此可以使用Class<T>
where T
类型的语法。通过编写Class<?>
,您可以声明一个Class
可以是任何类型的对象(?
是通配符)。该Class
类型是包含类元信息的类型。
通过指定特定类型来引用泛型类型始终是一种好习惯,这是通过Class<?>
尊重您的习惯(您知道Class
可参数化的)来使用的,但是您并没有将参数限制为具有特定类型。
有关泛型和通配符的参考:http : //docs.oracle.com/javase/tutorial/java/generics/wildcards.html
关于Class
对象和反射的参考(用于自省的Java语言功能):https : //www.oracle.com/technetwork/articles/java/javareflection-1536171.html
Class
无类型的代码相比,这样做有什么好处?它们似乎代表同一件事。
?
通配符” ,这没有其他好处。 。如果您不提供通配符,则编译器会假定您忘记了该类型或不知道该类是通用类,并会警告您。
Class<?>
Class
无法传递给类型为的参数 Class<?>
,因此Class<?>
对于所有情况都更加方便。
这<?>
是野兽。它通常会导致混乱和错误,因为当您第一次看到它时,便开始相信它<?>
是任何java类型的通配符。这是不正确的。<?>
是未知类型,略有不同。
与结合使用时,这不是问题Class
。这两行都可以工作并编译:
Class anyType = String.class;
Class <?> theUnknownType = String.class;
但是 -如果我们开始将其与集合一起使用,则会看到奇怪的编译时错误:
List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed
list.add("a String"); // doesn't compile ...
我们List<?>
不是一个集合,它仅适用于任何类型的对象。它只能存储一种类型:神秘的“未知类型”。肯定不是真正的类型。
这意味着您的Class引用可以保存对任何Class对象的引用。
它基本上与“类”相同,但是您向其他人展示了您不会忘记泛型的代码,您只想要一个可以容纳任何Class对象的引用。
Bruce Eckel,《 Java思维》:
在Java SE5中,Class <?>比普通类更可取,即使它们等效,并且如您所见,普通类也不会产生编译器警告。Class <?>的好处是它表明您不只是偶然或出于无知而使用非特定的类引用。您选择了非特定版本。