让我说我有班级:
class Box<T>{}
现在有什么区别:
public myMethod(Box box){};
和
public myMethod(Box<?> box){};
更新:
我问,因为我想看到对变量box
的影响,两种情况下变量是否相同。
答案 0 :(得分:3)
Collection<?>
(发音为“未知的集合”),即a 元素类型与任何东西匹配的集合。
我不确定你的Box类定义,因此很难用它来描述它。但是,如果您使用任何集合,如List,Map,Set。然后,您可以使用泛型定义它可能包含的对象类型。因此,如果未定义类型,则表示您允许在此处提及的集合中的原始类型
Collection c;
但是如果您希望此集合仅存储特定类型,则可以使用generfic指定它。例如,String:
的集合Collection<String> c;
但是如果你想允许存储任何类型的对象,那么你使用未知的集合,如下所定义:
Collection<?> c;
使用泛型,允许您在编译期间发现问题。
在此处阅读更多内容:http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html
答案 1 :(得分:3)
Generics 已经引入Java中,可以帮助您在编译时捕获大量错误,而不仅仅是在运行时遇到ClassCastException
。
当您使用<?>
(通配符)时,您对编译器说您不知道(或不关心)泛型类型。例如:如果您只想计算Iterable<?>
的元素数量,则根本不关心元素的类型,因此您可以创建一个带有签名int countElements(Iterable<?> iterable)
的方法,只需从Iterator<?>
中检索iterable
(再次注意通配符类型),然后只需调用hasNext()
和next()
,同时递增计数器。
你可以在没有<?>
的情况下做同样的事情,这就是所谓的原始类型。
您几乎不应该使用原始类型。允许原始类型,因为Java尝试尽可能向后兼容。如果他们不允许你使用原始类型,那么几乎所有来自1.5之前版本的Java代码(当引入泛型时)都必须重写;原始类型允许编译器编译该代码 - 尽管它会发出警告。