2.没有泛型的缺点:
1). 从集合中获取对象时可能需要进行类型转换
2). 还可能产生一个运行时错误: java.lang.classcastException
3.泛型的核心思想: 把一个list(集合)中的内容限制为一个特定的数据类型
4.面试问题: sql,泛型
下面的代码片断合法吗?
List<String> ls = new ArrayList<String>(); //1 --ok
List<Obijct> lo = ls; //2 --false
答案:
假设第二行合法,则:
lo.add(new object);//3
String s = ls.get(0);//4 试图把object赋值给string
这里,我们使用ls指向ls.
通过lo来访问ls,一个string的list
可以插入任意对象进去,结果是ls中保存不再是string
当我们试图从中取出元素的时候,会得到意外的结果。
所以第二行代码不合法。
**结论:如果Foo是Bar的一个子类型(子类或者子接口),而G是某种泛型声明,那么G<Foo>是G<Bar>的子类型并不成立!!
5.各种collections的父类: Collection<?>, ?即为泛型中的通配符,代表可以是任意类型
6.什么时候使用泛型方法,又什么时候使用通配符类型那?
泛型函数容许类型参数用来表示方法的一个或多个参数之间的依赖关系,或者参数与其返回值的依赖关系
如果没有这样的依赖关系,不应该使用泛型方法,而改为使用通配符
7.面试的问题:
List<String> l1 = new ArrayList<String>();
List<Integer> l2 = new ArrayList<Integer>();
System.out.println(l1.getClass() == l2.getClass()); // true
答案:
它打印出为true
因为所有的泛型类型在运行时有同样的类(class -- class java.util.ArrayList),而不管它们的实际类型参数
泛型之所以为泛型就是因为它对所有其可能的参数类型,有同样的行为;同样的类可以被当做许多不同的类型。
8.下限通配符:语法 ? super T 表示T的一个未知的父类(或者是T自己)