Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/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 - Fatal编程技术网

java泛型中通配符的使用

java泛型中通配符的使用,java,Java,我试图理解java通用通配符。我遇到了一个基本程序。在我看来,唯一可以添加到列表s中的是“null”。您不能添加 比如说 s.add(new Integer (4)); OR s.add(new Char(a)); 在阅读大量材料并迷惑我之前,我试图了解Java设计师在泛型中引入通配符的方向。从我的角度来看,我看不到任何有用的功能来自于泛型通配符。可能是因为我缺乏经验,而且我是Java新手。如果人们能够分享他们对通用通配符的想法,那就太好了重要 import java.util.Link

我试图理解java通用通配符。我遇到了一个基本程序。在我看来,唯一可以添加到列表s中的是“null”。您不能添加 比如说

s.add(new Integer (4)); 

OR

s.add(new Char(a));
在阅读大量材料并迷惑我之前,我试图了解Java设计师在泛型中引入通配符的方向。从我的角度来看,我看不到任何有用的功能来自于泛型通配符。可能是因为我缺乏经验,而且我是Java新手。如果人们能够分享他们对通用通配符的想法,那就太好了重要

import java.util.LinkedList;
import java.util.Iterator;

public class WildCardExampleOne {

    public static void main(String[] args)
    {
        LinkedList<?> s = new LinkedList<Integer>();
        s.add(null);

        Iterator<?> x = s.iterator();

        Object o = x.next();

        System.out.println(o);

        /* note that LinkedList<?> is NOT the same type as LinkedList<Object>
         * here are some statements that wouldn't compile:
         */
        // s.add(new Integer(3)); 
        // Iterator<Object> x = s.iterator();
    }
}
import java.util.LinkedList;
导入java.util.Iterator;
公共类通配符示例一{
公共静态void main(字符串[]args)
{
LinkedList s=新建LinkedList();
s、 添加(空);
迭代器x=s.Iterator();
对象o=x.next();
系统输出打印ln(o);
/*请注意,LinkedList与LinkedList的类型不同
*以下是一些无法编译的语句:
*/
//s.add(新整数(3));
//迭代器x=s.Iterator();
}
}

您不能直接用通配符实例化泛型类;与
扩展
超级
一起使用

在我看来,唯一可以添加到列表s中的是“null”

是的,这是正确的。但是,您经常会收到一个不需要(也不应该)添加任何元素的列表。例如,考虑一个简单的方法,将列表元素打印到标准输出,每行一行:

public static void printAll(final List<?> list) {
    for (final Object elem : list) {
        System.out.println(elem);
    }
}
publicstaticvoidprintall(最终列表){
用于(最终对象元素:列表){
系统输出打印项次(elem);
}
}

这个方法不需要知道列表的元素类型是什么;可以在
列表
数组列表
链接列表
、或任何其他
列表
上调用它。请查看java文档中的泛型:

其思想是您可以将它们用于方法类型:
Collection
(发音为“Collection of unknown”)是方法的超级类型

它让您可以从以下方面入手:

void printCollection(Collection<Object> c) {
    for (Object e : c) {
        System.out.println(e);
    }
}
void printCollection(集合c){
用于(对象e:c){
系统输出打印ln(e);
}
}
为此:

void printCollection(Collection<?> c) {
    for (Object e : c) {
        System.out.println(e);
    }
}
void printCollection(集合c){
用于(对象e:c){
系统输出打印ln(e);
}
}
其中,
Collection
允许您从中安全地读取元素,但不允许您将元素安全地存储到其中

它真正让你获得优势的地方是采取以下措施:

public void drawAll(List<Shape> shapes) {
    for (Shape s: shapes) {
        s.draw(this);
    }
}
public void drawAll(List<? extends Shape> shapes) {
    ...
}
public void doSomethingWithList(List<? extends Number> list) {

    for(Number number: list) {

        // do something with number

    }

}
public void drawAll(列表形状){
用于(形状s:形状){
s、 画(这个);
}
}
把它改写成这样:

public void drawAll(List<Shape> shapes) {
    for (Shape s: shapes) {
        s.draw(this);
    }
}
public void drawAll(List<? extends Shape> shapes) {
    ...
}
public void doSomethingWithList(List<? extends Number> list) {

    for(Number number: list) {

        // do something with number

    }

}

public void drawAll(List@chylis是对的,只是为了补充他/她的评论,我将尝试用简单的话来说:当然,通配符不允许您使用setter之类的方法,但它们允许您执行以下操作:

public void drawAll(List<Shape> shapes) {
    for (Shape s: shapes) {
        s.draw(this);
    }
}
public void drawAll(List<? extends Shape> shapes) {
    ...
}
public void doSomethingWithList(List<? extends Number> list) {

    for(Number number: list) {

        // do something with number

    }

}

“在阅读大量资料并迷惑我的头脑之前,我试图了解Java设计人员在泛型中引入通配符的方向。从我的角度来看,我看不到任何来自泛型通配符的有用功能”这句话让我感到困惑。如果你真的想阅读材料,我强烈建议你阅读。我们更希望你阅读大量的材料并迷惑你的头脑,试图理解Java开发人员的想法……在你来寻求帮助之前;-)这里的一些人非常擅长消除困惑!这些都是很好的参考资料。强烈建议您在发布到本网站之前尝试自己研究这些资料。