java - 何时在 Java 中使用无界通配符

标签 java generics

我开始了解无界通配卡,但我不明白它在现实世界中的用法。 在下面的程序中,使用和不使用这个无界通配符在编译时是相同的。那么为什么我们需要无界通配符?请帮助理解。

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/

相关文章:

java - 编写容器通用比较器的更好方法

java - 在 Eclipse 中显示值 1.8 不是有效的语言级别

java - neo4j 2.0未创建节点但运行成功

java - 无法从 long 转换为 int 错误仅在使用简单赋值时发生

java - 如何重现可能不是两个参数接口(interface)的子类型的通用接口(interface)类型变量的 java 编译/运行时错误?

java - 当类具有多个不同的字段时,如何对其进行泛化?

java - 在 sql 查询中使用 java.sql.Timestamp 对象

java - 使用 Criteria 和 Metamodel API 连接多个外键上的两个表

java - 如何使用泛型在抽象类中注入(inject)服务

java - 菱形运算符和动态类型中的附加类型