摘自《疯狂Java讲义》
泛型继承关系
如果Foo是Bar的一个子类型(子类或者子接口),而G是具有泛型声明的类或者接口,G<Foo>
并不是G<Bar>
的子类型
泛型原则:只要代码在编译时没有出现警告,就不会遇到运行时的ClassCaseException异常
泛型方法与类型通配符的区别
泛型方法允许类型形参用来表示方法的一个或者多个参数之间的类型依赖关系,或者方法返回值与参数之间的类型依赖关系,如果没有这样的类型依赖关系没,就不应该使用泛型方法。
类型通配符既可以在方法签名中定义形参的类型,也可以用于定义变量的类型,但反泛型方法中的类型参数必须在对应方法中显示声明
java8改进的类型推断
通过调用方法的上下文来推断类型参数的目标类型
在方法的调用链中,将推断得到类型参数传递到最后一个方法
擦除和转换
当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时,所有在尖括号之间的类型信息都将被扔掉,比如将一个List<String>
类型被转换为List,则该List对集合元素的类型检查变成了类型参数的上限(即Object)
eg
泛型与数组
数组元素的类型不能包括类型变量或者类型形参,除非是无上限的类型通配符,但是可以声明元素类型包含类型变量或者类型参数的数组,也就是说只能声明List<String>[]
形式的数组,但是不能实现ArrayList<String>[10]
.
try块
try块里声明的变量是代码块内的局部变量,他只在try块内有效
finally中的return
通常情况下,不要在finally块中使用如return或者throw的导致方法终止的语句,一旦finally块中使用了return或者throw,将会导致try块,catch块中的return,throw语句失效
eg
public class Test{
public static void main(String[] args) throws Exception{
boolean a = test();
System.out.println(a);
}
public static boolean test(){
try {
return true;
}finally {
return false;
}
}
}
输出结果:false
当java程序执行try块,catch块时遇到了return 或throw 语句时,这两个语句都会导致该方法立即结束,但是系统执行这两个语句并不会结束该方法,而是去寻找该异常处理流程中是否包含finally块,如果没有finally块,程序立即执行return或者throw语句,方法终止,如果有finally块,系统立即执行finally块,只有当finally块执行完成后,系统才会再次跳回来执行try块,catch块的return或throw语句,如果finally块里也使用return或throw等导致方法结束终止语句,finally块已经终止了方法,系统不会不会再跳回去执行try或catch