我开始了解Unbounded Wild卡,但我不明白在realworld中使用它。 在下面的程序使用和不使用这个Unbounded Wildcard将在编译时相同。那么为什么我们需要无界外卡?请帮助理解。
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);
}
}
答案 0 :(得分:1)
有两种情况,无界通配符是一种有用的方法:
带有例子 http://docs.oracle.com/javase/tutorial/java/generics/unboundedWildcards.html
答案 1 :(得分:1)
你在问为什么我们需要这个符号
List<?>
当更简单
List
相当于?
使用通配符更明确,但是为了向后兼容pre-generics代码,需要更简单的语法。所以你可以互换使用,但也有第三种方式来声明这个列表也是等价的。
List<? extends Object> list;
此列表仅包含Object类型的对象。由于Java中的所有内容都是从Object扩展而来的,因此基本上与无边界相同。
我个人可能会使用第一个,因为它很简洁,同时仍然明确说明List应包含的内容。如果你只是将它声明为没有泛型参数的List,那么它可能会被误认为是一个前泛型列表。
你什么时候想用这个?根据经验,我只使用遗留代码的这种无界列表。我总是被教导只将一种常见类型的对象放入一个列表(如客户列表等)。但是,人们并不总是编写好的代码,有时我不得不处理包含不同类型的列表。在这些情况下,很难转移到适当的通用列表,所以我不得不处理无限列表。
您可能有无限列表的合法原因。这取决于你想对这些对象做什么。如果一旦将它们添加到列表中,您只需要从Object类(如toString)或List接口(如大小)调用方法,那么也许您有一个无限列表的真实用例。
答案 2 :(得分:0)
首先,了解List&lt; Object&gt;非常重要。和列表&lt;?&gt;不一样。列表与LT;对象&gt;不是List&lt;扩展对象的任何东西&gt;的超类;但是List&lt;?&gt;或列表&lt;? extends Object&gt;是List&lt;任何扩展对象&gt;的超类。
在记住上述要点后,请通过此oracle链接https://docs.oracle.com/javase/tutorial/java/generics/unboundedWildcards.html
中的printList示例