我开始了解无界通配卡,但我不明白它在现实世界中的用法。 在下面的程序中,使用和不使用这个无界通配符在编译时是相同的。那么为什么我们需要无界通配符?请帮助理解。
public class UnboundedWildCards {
public static void main(String args[])
{
List<Integer> intLst = new ArrayList<Integer>();
intLst.add(1);
intLst.add(11);
List<Double> doubleLst = new ArrayList<Double>();
doubleLst.add(1.1);
doubleLst.add(11.11);
List lst = new ArrayList();
lst.add(new Object());
lst.add(new Double(2.3));
lst.add(new Integer(2));
print(intLst);
print(doubleLst);
print(lst);
unBoundprint(intLst);
unBoundprint(doubleLst);
unBoundprint(lst);
}
public static void print(List lst)
{
for(Object o : lst)
System.out.println(o);
}
public static void unBoundprint(List<?> lst)
{
for(Object o : lst)
System.out.println(o);
}
}
最佳答案
您是在问为什么我们需要符号
List<?>
当更简单
List
是等价的吗?
使用通配符更明确,但需要更简单的语法才能向后兼容预泛型代码。因此,您可以互换使用其中任何一种,但还有第三种声明此列表的方法,它也是等效的。
List<? extends Object> list;
此列表将仅包含 Object 类型的对象。由于 Java 中的所有内容都从 Object 扩展而来,这基本上与说无界相同。
就我个人而言,我可能会使用第一个,因为它很简洁,同时仍然明确说明列表应包含的内容。如果您只是将其声明为没有泛型参数的列表,那么它可能会被误认为是预泛型列表。
您什么时候想使用这个?根据经验,我只将这种无界列表与遗留代码一起使用。我总是被教导只将一种常见类型的对象放入列表中(例如客户列表等)。然而,人们并不总是编写出漂亮的代码,有时我不得不处理包含不同类型的列表。在这些情况下,很难转移到适当的通用列表,因此我不得不使用无界列表。
您可能有合理的理由使用无界列表。这取决于您想对这些对象做什么。如果将它们添加到列表后,您只需要调用 Object 类(如 toString)或 List 接口(interface)(如 size)中的方法,那么也许您有一个真正的无界列表用例。
关于java - 何时在 Java 中使用无界通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21577453/