通配符的使用

无限定通配符

使用类型通配符:

比如:List<?>,Map<?,?>

bool containsAll(Collection<?> c)

List<?>是List、List等各种泛型List的父类。

list<?>可读,但不能写。

下面以可读特性举例2个:

class Util
{
    public static void show (ArrayList<?> list)
    {
        for (Object o : list) {
            System.out.println(o);
        }
    }
}
class T2 {

    @Test
    void test1 ()
    {
        // 可读
        ArrayList<Object> objects = new ArrayList<>();
        objects.add(23);
        objects.add("hello");
        objects.add(23.1);

        ArrayList<String> strings = new ArrayList<>();
        strings.add("hello");
        strings.add("java");
        strings.add("&php");

        Util.show(objects);  // ok
        Util.show(strings);  // ok
    }
}
ArrayList<?> list = new ArrayList<>();
ArrayList<Object> objects = new ArrayList<>();
objects.add(23);
objects.add("hello");
objects.add(23.1);

list = objects;
System.out.println(list.get(0));  // 23

list<?>不可写

ArrayList<?> list = new ArrayList<>();
ArrayList<Integer> objects = new ArrayList<>();
objects.add(23);
objects.add(231);
objects.add(2);

list = objects;
list.add(32); // error

有限制的通配符

<? extentds Number> 只允许时Number或Number的子类,即<=Number
<? super Number> 只允许时Number或Number的父类,即>=Number
<? extends Comparable> 只允许泛型为实现Comparable接口的实现类的引用

boolean addAll(Collection<? extends E> c)
default boolean removeIf(Predicate<? super E> filter)