通配符的使用
无限定通配符
使用类型通配符:?
比如:List<?>,Map<?,?>
bool containsAll(Collection<?> c)
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)