将<! - ? - >添加到参数而不添加它之间有什么区别?

时间:2013-08-27 17:40:22

标签: java generics

让我说我有班级:

class Box<T>{}

现在有什么区别:

public myMethod(Box box){};

public myMethod(Box<?> box){};

更新:

我问,因为我想看到对变量box的影响,两种情况下变量是否相同。

2 个答案:

答案 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代码(当引入泛型时)都必须重写;原始类型允许编译器编译该代码 - 尽管它会发出警告。