Java语言基础学习笔记(六)

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. 泛型类和泛型方法的声明并不会被擦出,所以可以通过反射机制访问他们。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值