2、参数化类型与原始类型的兼容性:
a)参数化类型可以引用一个原始类型的对象,编译报告警告,例如
Collection<String> c = new Vector();//可不可以不就是编译器一句话的事吗?
b)原始类型可以引用一个参数化类型的对象,编译报告警告,例如
Collection c = new Vector<String>();//原来的方法接受一个集合参数,新的类型也要能传进去
3、参数化类型不考虑类型参数的集成关系:
a)Vector<String> v = new Vector<Object>();//错误,不谢Object没错,写了就是明知故犯
b)Vector<Object> v = new Vector<String>();//也错误,
4、在创建数组实例时,数组的元素不能使用参数化的类型,例如,下面的语句有误:
Vector<Integer> vectorList[] = new Vector<Integer>[10];
5、思考题:下面的代码会报错吗?
Vector v1 = new Vector<String>();
Vector<Object> v = v1; //原始类型传给带参数类型,不会报错
二、泛型中的 ? 通配符
1、定义一个方法,该方法用于打印出任意参数化类型的集合中的所有数据,该方法如何定义呢?
错误方式:
public static void printCollection(Collection<Object> collection){
三、泛型中的?通配符的扩展
1、限定通配符的上边界:
正确:Vector<? extends Number> x = new Vector<Integer>();
错误:Vector<? extends Number> x = new Vector<String>();
2、限定通配符的下边界:
正确:Vector<? super Integer> x = new Vector<Number>();
错误:Vector<? super Integer> x = new Vector<Byte>();
3、提示:
限定通配符总是包括自己
d)当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时
这多处的实际应用类型对应到了不同的类型,并且使用返回值,这时候优先考虑返回值的类型,
例如,下面语句实际对应的类型就是Integr了,编译将报告错误,将变量X的类型改为float,
对比eclipse报告的错误提示,接着再讲变量x类型改为Number,则没有了错误:
int x = (4,4.4f) --> static <T> T add(T a,T b)
六、定义泛型类
1、如果累的实例对象中的多处都要用到同一个泛型参数,即这些地方引用的泛型类型要保持同一个
实际类型时,这时候就要采用泛型类型的方式进行定义,也就是类级别的泛型,语法格式如下:
public class GenericDao<T> {
private T field;
public void save(T obj){}
pubilc T getById(int id ){}
}
2、类级别的泛型是根据引用该类名时指定的类型信息来参数化类型变量的,例如,如下两种方式都可以
GenericDao<String> dao = null;
new GenericDao<String>();