【发布时间】:2015-04-24 20:27:56
【问题描述】:
我是 Java 新手。在this 文档中,他们将此作为使用通配符的用例:
static void printCollection(Collection c) {
Iterator i = c.iterator();
for (int k = 0; k < c.size(); k++) {
System.out.println(i.next());
}
}
这是他们的解决方案:
static void printCollection(Collection<?> c) {
for (Object e : c) {
System.out.println(e);
}
}
但我可以在没有通配符的情况下做同样的事情:
static <T> void printCollection(Collection<T> c) {
Iterator i = c.iterator();
for (int k = 0; k < c.size(); k++) {
System.out.println(i.next());
}
}
谁能告诉我一个简单的用例,其中常规泛型不起作用但通配符可以?
更新:这里的答案When to use wildcards in Java Generics? 并没有告诉我们需要通配符。实际上是相反的。
【问题讨论】:
-
我不完全确定,但我相信没有通配符的最后一个版本可能会在调用具有不同集合类型的方法时产生特定于每个
Collection类型的同一方法的多个版本。有通配符的人会处理所有这些。 -
@NobuGames 在 Java 中,这将是一种方法,因为泛型在编译时被删除。
-
the official docs 很好地回答了这个问题
-
通配符可以(糟糕地)模拟协变和逆变。
-
Java 能做什么那个程序集不能做什么?
标签: java generics bounded-wildcard unbounded-wildcard