这一章节我们来讨论一下无界通配符。
1.怎样使用无界通配符?
无界通配符是直接使用<?>
例子:
package com.ray.ch13;
import java.util.ArrayList;
import java.util.List;
public class Test {
@SuppressWarnings("unused")
private static List<?> list2;
public static void test2(List<?> list) {
list2 = list;
}
@SuppressWarnings("rawtypes")
public static void main(String[] args) {
test2(new ArrayList());// rawtypes
test2(new ArrayList<String>());
}
}
2.使用无界通配符需要注意的地方?
例子:
package com.ray.ch13;
import java.util.ArrayList;
import java.util.List;
public class Test {
@SuppressWarnings({ "rawtypes", "unused" })
private static List list1;
@SuppressWarnings("unused")
private static List<?> list2;
@SuppressWarnings("unused")
private static List<? extends Object> list3;
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void test1(List list) {// rawtypes
list1 = list;
list2 = list;
list3 = list;// unchecked
}
public static void test2(List<?> list) {
list1 = list;
list2 = list;
list3 = list;
}
public static void test3(List<? extends Object> list) {
list1 = list;
list2 = list;
list3 = list;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) {
test1(new ArrayList());// rawtypes
test2(new ArrayList());// rawtypes
test3(new ArrayList());// unchecked/rawtypes
test1(new ArrayList<String>());
test2(new ArrayList<String>());
test3(new ArrayList<String>());// unchecked
}
}
我们仔细观察上面的代码,主要看警告,从而得出下面的结论:
(1)List<?>,使用通配符的意义?
就是告诉编译器,我这里需要使用泛型,但是一时我还没有决定类型参数是什么,暂时是全配。
(2)List与List<?>是否有区别?
有。
List,由于类型擦除的关系,List跟List<Object>是等价的,因此List表示的是类型参数是Object的List。
List<?>,表示我这里的类型参数其实是特定的,但是,只是一时没有确定下来。
(3)List<?>与List<? extends Object>是否有区别?
有。
List<?>可以add任何类型的对象,List<? extends Object>只能够add“null”对象。
要是List<? extends Object>换成List<? super Object>,那么他就可以add任何类型的对象。
总结:这一章节主要讲述了无界通配符是怎样使用的,需要注意什么。当然,由于笔者水平有限,更深层次的问题暂时还没有发现,有待后面的补充。
这一章节就到这里,谢谢。
-----------------------------------