我的问题如上所述。抱歉,可能是重复的,但是最后找不到一个示例<?>。
为什么不只使用它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 <?>的好处是它表明您不只是偶然或出于无知而使用非特定的类引用。您选择了非特定版本。