Class <?>在Java中意味着什么?

dav*_*rld 124 java syntax

我的问题如上.对不起,它可能是重复但我找不到最后的例子<?>.

你为什么不只是Class用作参数?

man*_*nub 96

Class是一个可参数化的类,因此您可以使用语法Class<T>where T是一个类型.通过写入Class<?>,您将声明一个Class可以是任何类型的对象(?是通配符).该Class类型是包含类元信息的类型.

通过指定他的特定类型来引用泛型类型总是很好的做法,方法是使用Class<?>您尊重这种做法(您知道Class可以参数化),但是您并不限制您的参数具有特定类型.

关于泛型和通配符的参考:http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

关于Class对象和反射的参考(用于内省自身的Java语言的特性):http://java.sun.com/developer/technicalArticles/ALT/Reflection/

  • 仅仅使用没有类型的`Class`这样做有什么好处?他们似乎代表着同样的事情. (6认同)
  • 没有其他好处,除了你告诉编译器"我知道这是一个泛型类,但我不知道或不关心实际类型,所以不是给出一个具体的类型我给'?`通配符".如果您不提供通配符,编译器会假定您忘记了类型或者不知道该类是通用的,并会警告您. (4认同)

And*_*s_D 60

<?>是一头野兽.它经常导致混乱和错误,因为,当你第一次看到它,然后你开始相信,<?>任何java类型的通配符.这是......不是真的.<?>一种未知的类型,一个轻微和讨厌的差异.

使用它时不是问题Class.这两行都可以工作和编译:

Class anyType = String.class;
Class <?> theUnknownType = String.class;
Run Code Online (Sandbox Code Playgroud)

但是 - 如果我们开始将它与集合一起使用,那么我们会看到奇怪的编译时错误:

List<?> list = new ArrayList<Object>();  // ArrayList<?> is not allowed
list.add("a String");                    // doesn't compile ...
Run Code Online (Sandbox Code Playgroud)

我们List<?>不是一个集合,适用于任何类型的对象.它只能存储一种类型:神秘的"未知类型".当然,这不是真正的类型.


Fil*_*lip 6

这意味着您的Class引用可以包含对任何Class对象的引用.

它与"类"基本相同,但是你向其他人展示了你没有忘记泛型的代码,你只需要一个可以容纳任何Class对象的引用.

Bruce Eckel,Thinking in Java:

在Java SE5中,Class <?>比普通类更受欢迎,即使它们是等效的,如您所见,普通类也不会产生编译器警告.Class <?>的好处是它表明你不仅仅是偶然使用非特定的类引用,也不是出于无知.您选择了非特定版本.


Boz*_*zho 5

这是一个泛型文字.这意味着您不知道此Class实例所代表的类的类型,但您仍在使用通用版本.

  • 如果你认识这门课,你就会使用Class<Foo>.这样您就可以创建一个新实例,例如,不进行强制转换:Foo foo = clazz.newInstance();
  • 如果你根本不使用泛型,你至少会得到一个警告(并且通常不鼓励使用泛型,因为它可能导致难以察觉的副作用)


Jas*_*onw 5

在泛型中,未知类型由通配符“?”表示。在这里阅读官方示例。