泛型
泛型实现了参数化类型概念,使代码可以应用于多种类型
简单泛型
- 元组是一个单一对象,它将以组队想直接打包存储于其中,它允许读取不允许存放(也叫做信使,数据传送对象)
泛型接口
- 泛型可用于接口,例如生成器
泛型方法
- 可以在类中参数化方法,是否拥有泛型方法,与所在类是否是泛型的没有关系
- 泛型方法使得该方法能够独立于类而产生变化
- 如果使用泛型方法可以取代将整个类泛型化,那么就应该只是用泛型方法
- 定义泛型方法只需要将反省参数列表至于返回值之前
- 是用泛型方法是通常不必指明参数类型,编译器会找出具体类型,称作类型参数推断。
- 像调用普通方法一样调用泛型方法,而且就好像是方法被无限次重载过
- 泛型方法与可变参数可以很好地共存
匿名内部类
- 泛型还可以应用于内部类以及匿名内部类
擦除的神秘之处
- 在反省代码内部,无法获得任何有关反省参数类型的信息。
- java泛型使用擦除来实现,任何具体的类型信息都被擦出了,唯一知道的就是在使用一个对象。
- 擦除的代价是:不能用于显示地引用运行时类型的擦做之中,如转型,instancof和new
- 擦除在方法体中溢出了类型信息,所以在运行时的问题就是边界,即对象进入和离开方法的地点,这些正是编译器在编译器兼执行类型检查并插入转型代码的地点
- 泛型中的所有动作都发生在边界处,对传递进来的值进行额外的编译器检查,并插入对传递出去的值的转型
擦除的补偿
- 显示的传递类型的Class对象,并在表达式中使用它
- 不能创建泛型数组,在任何想要创建泛型数组的地方使用ArrayList
边界
- extends关键字在泛型边界上下文环境中和普通情况下具有的意义是完全不同的
通配符
- Apple是一种Fruit,不代表List就是一种List。
- 超类通配符super
- 无界通配符?
问题
- 任何基本类型都不能作为类型参数,使用包装类
- 一个类不能实现同一个泛型接口的莱昂个变体,由于擦除的原因,两个变体会变成相同的接口产生冲突
- 使用带有泛型类型参数的转型或instanceof不会有任何效果
异常
- catch语句不能捕获泛型类型的异常
- 类型参数可能会在一个方法的throws字句中用到
混型
- 其最基本的概念是混合多个类的能力已产生一个可以表示混型中所有类型的类
泛型真是博大精坑啊!