Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中何时使用无界通配符_Java_Generics - Fatal编程技术网

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

在Java中何时使用无界通配符,java,generics,Java,Generics,我开始了解无限通配符,但我不明白它在现实世界中的用法。 在下面的程序中,使用和不使用这个无界通配符在编译时是相同的。那么为什么我们需要无界通配符呢?请帮助理解 public class UnboundedWildCards { public static void main(String args[]) { List<Integer> intLst = new ArrayList<Integer>(); intLst.add

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

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);
    }
}
公共类无界wildcards{
公共静态void main(字符串参数[])
{
List intLst=new ArrayList();
补充(1);
补充(11);
List doubleLst=new ArrayList();
doubleLst.添加(1.1);
doubleLst.增补(11.11);
List lst=new ArrayList();
添加(新对象());
第一项增加(新的双(2.3));
lst.add(新整数(2));
打印(intLst);
打印(doubleLst);
打印(lst);
未绑定打印(intLst);
未绑定打印(doubleLst);
未绑定打印(lst);
}
公共静态无效打印(列表lst)
{
用于(对象o:lst)
系统输出打印ln(o);
}
公共静态无效未绑定打印(列表lst)
{
用于(对象o:lst)
系统输出打印ln(o);
}
}

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

  • 如果您正在编写一个可以使用对象类中提供的功能实现的方法
  • 当代码在泛型类中使用不依赖于类型参数的方法时。例如,List.size或List.clear。事实上,类之所以经常被使用,是因为类中的大多数方法都不依赖于T
  • 举例说明

    您是在问我们为什么需要符号吗

    List<?> 
    
    是否等效

    使用通配符更显式,但为了向后兼容预泛型代码,需要更简单的语法。因此,您可以互换使用这两种方法中的任何一种,但还有第三种方法声明此列表,这也是等效的

    List<? extends Object> list;
    

    List首先,重要的是要理解List和List是不同的。列表不是列表的超类

    您到底想知道什么。你从那篇文章中感到困惑的是什么?又是一篇好文章。另一种情况:如果您必须使用非通用时间段的代码(例如Java1.4)<代码>列表=oldShittyCode.getList()这一个非常有用
    List<? extends Object> list;