这一章节我们来讨论一下*通配符。
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任何类型的对象。
总结:这一章节主要讲述了*通配符是怎样使用的,需要注意什么。当然,由于笔者水平有限,更深层次的问题暂时还没有发现,有待后面的补充。
这一章节就到这里,谢谢。
-----------------------------------