您的位置:首页 > 编程语言 > Java开发

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. 泛型类和泛型方法的声明并不会被擦出,所以可以通过反射机制访问他们。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: