Java语言基础学习笔记(六)
2017-09-18 07:36
555 查看
1. 编写泛型类时,类型参数不能用基本类型来进行实例化,因为类型擦除后实际生成的是Object。
2. 当你调用泛型方法时,不需要指定类型参数,它可以从方法的参数和返回类型中推断出来。如果你喜欢,也可以在方法名前使用类型参数 比如: obj.<String>swap(i, j)
3. 如果T extends P, T是P的子类型,因此T[]也是P[]的子类型,但ArrayList<T>并不能看作ArrayList<P>的子类型。
4. 许多情况下,数组列表间的转换其实是安全的。如果一个方法不对数组列表进行写操作,那么他就不会损坏数组列表。可以使用通配符来表达这种形式。
5. 子类型通配符中,<? extends T>表示实际类型是T的子类,那么任何该<? extends T>对象转换为T是没有问题的,但将其他T对象转换为<? extends T>对象却是不合法的。
6. 父类型通配符中,<? super T>表示实际类型是T的父类,那么将任何T对象转换为<? extends T>是没有问题的,但是将<? extends T>转换为T对象却是不合法的。
7. 通配符限定可以是一个类型变量,比如:public static <T> void do(T[] el, Predicat<? super T> filter)
8. 无限定通配符<?>可以当作一个类型参数,但不能当作类型。所以 ? temp = el.get(i)是非法的。可以通过一个泛型方法来代理实现。
9. 泛型类扩展Throwable不合法,因此无法抛出或捕获泛型类实例,但在异常声明中使用类型参数是可以的。
10. 不允许使用数组语法来构建一个泛型数组。Pair<String, String> pairs = new Pair<>[100]是非法的,变通方法是Pair<String, String> pairs = (Pair<String, String>)new Pair[100]
11. 不能实例化类型变量。new T[100],new T() 都是非法的。要实现这个功能,可以提供方法引用的方式提供数组的构造函数,或者让用户提供类的Class对象,利用反射机制来创建实例。
12. 不能构造参数化类型的数组。Entry<String>[] entry = new Entry<String>[100]是非法的。使用ArrayList来辅助,ArrayList<Entry<String>> entry = new ArrayList<>(100)。
也可以使用 Entry<String>[] entry = (Entry<String>[])new Entry<?>[100]
13. 静态上下文中的类类型变量是无效的。因为静态类对象只有一个实例,泛型类在类类型参数擦出后,其实只有一个类。
14. 泛型类和泛型方法的声明并不会被擦出,所以可以通过反射机制访问他们。
2. 当你调用泛型方法时,不需要指定类型参数,它可以从方法的参数和返回类型中推断出来。如果你喜欢,也可以在方法名前使用类型参数 比如: obj.<String>swap(i, j)
3. 如果T extends P, T是P的子类型,因此T[]也是P[]的子类型,但ArrayList<T>并不能看作ArrayList<P>的子类型。
4. 许多情况下,数组列表间的转换其实是安全的。如果一个方法不对数组列表进行写操作,那么他就不会损坏数组列表。可以使用通配符来表达这种形式。
5. 子类型通配符中,<? extends T>表示实际类型是T的子类,那么任何该<? extends T>对象转换为T是没有问题的,但将其他T对象转换为<? extends T>对象却是不合法的。
6. 父类型通配符中,<? super T>表示实际类型是T的父类,那么将任何T对象转换为<? extends T>是没有问题的,但是将<? extends T>转换为T对象却是不合法的。
7. 通配符限定可以是一个类型变量,比如:public static <T> void do(T[] el, Predicat<? super T> filter)
8. 无限定通配符<?>可以当作一个类型参数,但不能当作类型。所以 ? temp = el.get(i)是非法的。可以通过一个泛型方法来代理实现。
9. 泛型类扩展Throwable不合法,因此无法抛出或捕获泛型类实例,但在异常声明中使用类型参数是可以的。
10. 不允许使用数组语法来构建一个泛型数组。Pair<String, String> pairs = new Pair<>[100]是非法的,变通方法是Pair<String, String> pairs = (Pair<String, String>)new Pair[100]
11. 不能实例化类型变量。new T[100],new T() 都是非法的。要实现这个功能,可以提供方法引用的方式提供数组的构造函数,或者让用户提供类的Class对象,利用反射机制来创建实例。
12. 不能构造参数化类型的数组。Entry<String>[] entry = new Entry<String>[100]是非法的。使用ArrayList来辅助,ArrayList<Entry<String>> entry = new ArrayList<>(100)。
也可以使用 Entry<String>[] entry = (Entry<String>[])new Entry<?>[100]
13. 静态上下文中的类类型变量是无效的。因为静态类对象只有一个实例,泛型类在类类型参数擦出后,其实只有一个类。
14. 泛型类和泛型方法的声明并不会被擦出,所以可以通过反射机制访问他们。
相关文章推荐
- Java语言基础学习笔记——基础语法
- JAVA学习笔记——第三章 Java语言基础
- Java2核心技术第七版的学习笔记(三) Fundamental Programming Structures in Java(Java语言的基础)(四):
- 学习笔记 Java语言基础 2014.7.9
- Java2核心技术第七版的学习笔记(三) Fundamental Programming Structures in Java(Java语言的基础)(一)
- Java学习笔记 第二章 Java语言基础
- Java学习笔记-2.Java语言基础
- 黑马程序员——JAVA学习笔记——语言基础
- Java学习笔记:语言基础
- 传智博客学习笔记16--JAVA SCRIPT HTML语言基础
- 黑马程序员-Java语言基础学习笔记
- Java学习笔记之语言基础―― Java中浮点数除0问题
- Java面对对象编程---学习笔记(JAVA语言基础)
- 学习笔记 Java_毕向东_语言基础_程序流程控制 2014.7.29
- Java学习笔记之语言基础――Java中的参数传递
- Java2核心技术第七版的学习笔记(三) Fundamental Programming Structures in Java(Java语言的基础)(三)
- Java学习笔记(一、Java语言基础)
- Java学习笔记之语言基础—— 浮点数的取模运算
- 黑马程序员——学习笔记02.java的语言基础
- C#学习笔记(有C,C++,JAVA语言基础)