Java泛型---通配符

泛型通配符<?>及上下限(extends、super)

import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

/**
 * 测试泛型的通配符---->? 
 * 表示类型不确定,用于声明变量、形参,不能用于定义泛型类、对象、接口
 * 
 * 上限(用于限制操作) extends
 * ? extends List
 * 表示定义的类型不能超过List,定义的类型必须为List或List的实现
 * 不能用在添加操作
 * <?>相当于<? extends Object>,一般不能存放在使用了extends的泛型中,除非是<? extends Object>
 * 
 * 下限  super
 * 不能低于某一类型
 * 如:? super List
 * 可以存放指定类自身或其父类
 * 可以添加,但不能添加父类对象(在某一范围以上,因此可以添加此范围以下的对象,能够定义的类型皆>=这些对象的范围
 * 反之,高于这一范围,可能定义的类型如定义类型为LinkedList,List的对象就不能添加在linkedList中
 * 定义时可能为List,将List对象添加到其子类中不合理)
 * @author Administrator
 *
 */
public class Wildcards {
	public static void main(String[] args) {
		//声明变量
		List<? extends List> list = new ArrayList<List>();
		list = new ArrayList<ArrayList>();
		list = new ArrayList<LinkedList>();
		//不能用于创建对象
	//	list = new ArrayList<?>();
		List<List> list2 = new ArrayList<List>();
		List<Collection> list3 = new ArrayList<Collection>();
		List<? super ArrayList> list4 = new ArrayList<Object>();
		
		test1(list2);
		test1(list3);
		//super 下限  不能存放低于指定类型的对象
		//test1(list4);
		
		
		
	}
	//声明形参
	public static void test(List<? extends List> list){
		//为保证兼容的一致性,,使用extends某一个对象后不能使用add方法加入对象
		//因为不能保证加入的对象是已有对象的子类
		//可以加入null
		//list.add(LinkedList);
		//list.add(ArrayList);
		list.addAll(null);
		
	}
	//下限
	public static void test1(List<? super List> list){
		
	}
	//不能用于定义方法
//	public static <?> void test(){}
//
//}
//不能用于创建类、接口
//class Ac<?>{}
//仅说明
//Interface A<?>{} 
}

    

猜你喜欢

转载自blog.csdn.net/qq_30007589/article/details/80851186