泛型通配符<?>及上下限(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<?>{}
}