何时在Java中使用Unbounded Wild Card

时间:2014-02-05 12:34:28

标签: java generics

我开始了解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);
    }
}

3 个答案:

答案 0 :(得分:1)

有两种情况,无界通配符是一种有用的方法:

  1. 如果您正在编写可以使用Object类中提供的功能实现的方法。
  2. 当代码使用泛型类中不依赖于类型参数的方法时。例如,List.size或List.clear。实际上,经常使用Class,因为Class中的大多数方法都不依赖于T。
  3. 带有例子 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示例