3

Lets say I have the class :

class Box<T>{}

Now what is the difference between :

public myMethod(Box box){};

and

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

Update:

I'm asking because I want to see the effect on the variable box, Is the variable identical in both cases or not.

4

2 回答 2

3

泛型已被引入 Java 以帮助您在编译时捕获各种错误,而不仅仅是ClassCastException在运行时遇到。

当您使用<?>(a wildcard ) 时,您是在对编译器说您不知道(或不关心)泛型类型。例如:如果您只想计算 an 的元素数量Iterable<?>,您根本不关心元素的类型,因此您可以创建一个带有签名的方法,该方法int countElements(Iterable<?> iterable)只需Iterator<?>从中检索 an iterable(注意通配符再次输入),然后只需调用hasNext()and next(),同时增加一个计数器。

可以在没有 的情况下做同样的事情<?>,这就是所谓的原始类型

您几乎不应该使用原始类型。允许使用原始类型,因为 Java 试图尽可能向后兼容。如果它们不允许您使用原始类型,那么几乎所有 1.5 之前版本的 Java 代码(当引入泛型时)都必须重写;原始类型允许编译器编译该代码——尽管它会发出警告。

于 2013-08-27T17:46:16.197 回答
3

Collection<?>(发音为“未知集合”),即元素类型匹配任何内容的集合。

我不确定您的 Box 类定义,因此很难从中进行描述。但是,如果您使用任何集合,例如 List、Map、Set。然后,您可以使用泛型定义它可能包含的对象类型。因此,如果未定义类型,则意味着您允许在您的集合中使用原始类型,如此处所述

Collection c;

但是,如果您希望此集合仅存储特定类型,则可以使用泛型指定它。例如字符串的集合:

Collection<String> c;

但是,如果您想允许存储任何类型的对象,那么您可以使用未知集合,如下所述:

Collection<?> c;

使用泛型,可以让您在编译时发现问题。

在此处阅读更多信息:http: //docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

于 2013-08-27T17:41:52.387 回答