Test test = new Test();//子类
GenericTest g1 = new GenericTest();//父类
//上限 (类本身及子类)的赋值均可以 还有或者(接口本身及其实现类)或者(接口本身及子接口) 这里没有给出例子均是相似的
List<? extends GenericTest> list = new ArrayList<GenericTest>();//本类型 可以
list = new ArrayList<Test>();//子类型 可以
/*
以上表明赋值没有问题,但是list的add方法都不可行 ,
首先明确我要添加的是指定类型或者其子类型;
对于 List<? extends GenericTest> list = new ArrayList<Test>();
这里指定了参数化的类型是Test,如果GenericTest还有一个子类Test2,
从声明的类型<? extends GenericTest>来看Test2(子类)的实例是可以添加的,
但是从定义的角度new ArrayList<Test>()来看规定存放的类型必须是Test类型的,Test2实例不能添加,
这是矛盾的,所以extends的list不能有添加方法
既然不能add,但是可以通过赋值制来达到目的,所以可以得出上限的泛型只是用来引用指定类型或者其子类类型泛型对象使用的,
示例如下:
*/
List<Test> listTest1 = new ArrayList<Test>();
listTest1.add(new Test());
listTest1.add(new Test());
listTest1.add(new Test());
list = listTest1;
//---------------------------------------------------------
/*
对于下限来讲,这里我要添加的还是指定类型或者其子类型;
以List<? super GenericTest> list3 = new ArrayList<Object>();为例
GenericTest或者其子类型都一定是<? super GenericTest>类型的(多态),
GenericTest或者其子类型也都一定是Object类型的(多态),
均满足,所以可以添加;
但是如果要添加GenericTest的父类型一样会报错的(道理同extends部分)
所以可以看出下限的泛型的用来添加指定类型及其子类型的时候接近于普通的泛型的使用;
另一方面下限的泛型同样可用来引用指定类型父类型泛型的对象。
相对于上限泛型,下限泛型功能性更强一些。
*/
List<? super GenericTest> list3 = new ArrayList<Object>();
list3.add(test);
list3.add(g1);
//list3.add(new Object());
list3 = new ArrayList<GenericTest>();
list3.add(test);
list3.add(g1);
}
}