java内功系列六(泛型、异常、注解)

泛型:

1.泛型的出现主要解决了容器中元素放进去后直接变成了object类型。在编译的时候如果传入错误的元素将会出错。
2.每次传给泛型类、接口的类型参数不一样相当于创建了一个新的类。list<string>和list以及list<int>是不一样的类型。(逻辑上存在物理上不存),list<string>和list<int>在物理上对应的文件还是list类文件,所以list<string>.clas和list<int>.class是相等的。
3.由于泛型共享一个物理文件,所以针对类级别的操作不能有泛型出现,如不能有泛型静态变量,泛型静态方法中的泛型参数(静态方法本身可以是泛型方法,它不适用类的泛型形参)。同理instanceof方法后面也不能有泛型。
4.如果foo是bar的子类,那么foo[]依然是bar[]的子类型,但是G<foo>不是G<bar>的子类,更不相等。
5.通配符泛型的集合不能给集合添加元素(java不允许把一个对象放进未知类型集合)。list<?> ls;ls.add("xx");这种是错误的。通配符泛型集合可以设置上限(list<? extends shap>)和下限(list<? super shap>)
6.类型形参也可设置上限(list<T extends person & java.io.Serializable> 表示T必须实现person并且实现Serializable接口)和下限(list<T super person> 表示T必须是person父类)
7.泛型方法格式(调用的时候不用像类一样指定参数类型,系统会自动判断)
修饰符 <T,S> 返回类型 方法名(形参列表){}
8.泛型类被继承时定义子类时必须确定泛型的具体类型,或者子类提供泛型,父类继续用子类的泛型。
9.使用通配符还是泛型方法(目前没有太明白):目前一点是泛型方法主要设计的类型形参表示方法一个或者多个参数之间有类型依赖关系,或者返回值与参数之间有依赖关系,否则用通配符。(参考疯狂java 9.4.2节)
10.擦除和转换:把一个带有泛型的类转换为非泛型的类将失去泛型功能,基本对象也会变为object。如:list<string> l;list m=l;m失去string信息


 

异常:

1.异常主要依赖try、catch、finally、throw、throws关键字构成。
2.如果在try、catch使用exit等方法将应用程序关闭,那么finally块将不会执行,不要在finally块中使用return、throw语句,这样导致try、catch中的return和throw语句失效。当系统运行到try、catch块中发现有return或throw,程序不会立即执行它而是看是否有finally块,执行完finally后再回过头执行return或throw。但是如果finally中已经有return或throw那么它直接执行finally中的,try和catch中的就不会再执行了。(因此建议不要在finally中写return和throw)
3.针对异常可以先在方法内部做预先处理,然后继续把异常封装后或者不封装直接抛给调用者处理(catch和throw的结合)

注解:

1.自定义annotation:
public @interface test{}
2.可以给不同元素附件不同的元数据后再执行的时候做特殊处理,如自动化测试,添加事件处理方法。定义了annotation后还需要工具对这些annotation进行后期处理(绑定特别的功能等)

猜你喜欢

转载自blog.csdn.net/yuliantao/article/details/82740378