在java泛型中使用通配符

liv*_*hak -1 java

我试图理解java通用通配符.我遇到了一个基本程序.在我看来,唯一可以添加到列表中的是"null".例如,您无法添加

s.add(new Integer (4)); 

OR

s.add(new Char(a));
Run Code Online (Sandbox Code Playgroud)

在阅读大量材料并混淆我的想法之前,我试图了解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();
    }
}
Run Code Online (Sandbox Code Playgroud)

rua*_*akh 6

在我看来,唯一可以添加到列表s的是"null".

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

public static void printAll(final List<?> list) {
    for (final Object elem : list) {
        System.out.println(elem);
    }
}
Run Code Online (Sandbox Code Playgroud)

此方法不需要知道列表的元素类型是什么; 它可以在a List<String>,an ArrayList<Integer>,a LinkedList<Object>或任何其他上调用List<?>.