从头认识java-13.13 *通配符

时间:2021-08-10 09:49:41

这一章节我们来讨论一下*通配符。

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任何类型的对象。

 

总结:这一章节主要讲述了*通配符是怎样使用的,需要注意什么。当然,由于笔者水平有限,更深层次的问题暂时还没有发现,有待后面的补充。

 

这一章节就到这里,谢谢。

-----------------------------------

目录