泛型程序设计详解

泛型程序设计

使用泛型程序设计的程序设计的好处

避免继承的强制类型转化

对于集合来说可以保证统一的类型

简单泛型类
public class pair<T, U>{
    private T first;
    private U second;
    public pair(){...};
    public pair(T first, T second){...};
}//T,U表示pair类中字段可用的类型
泛型方法
class ArrayAlg {
    public static <T, U> T getMiddle(T...a) {//<T, U>类型变量表示参数中可用的类型
        return a[a.length / 2];
    }
}
类型变量的限定

public static <T enxtends U [& M...] > T func(T t),这里的限定为T必须继承U、M…类型

泛型代码和虚拟机

虚拟机没有泛型对象——所有对象都属于普通类。

  1. 类型擦除

    无论何时第一一个泛型类型,都会自动提供一个相应的原始类型,有限定返回限定类型,没有则返回object类型

    public class pair<T, U>{
        private T first;
        private U second;
        public pair(){...};
        public pair(T first, T second){...};
    }//T,U表示pair类中字段可用的类型
    

    擦除后

    public class pair<Object, Object>{
        private Object first;
        private Object second;
        public pair(){...};
        public pair(Object first, Object second){...};
    }//T,U表示pair类中字段可用的类型
    
  2. 转换泛型表达式

    擦除了返回类型,编译器会在调用原始方法后自动进行强制类型转换

  3. 转换泛型方法

    擦除一些变量的类型后,要调用变量的方法,JVM提供了桥方法来实现

限制与局限性
  1. 不能用基本类型实例化类型参数
  2. 运行是类型查询只适用于原始类型(instanceof)
  3. 不能创建参数化类型的数组
  4. Varargs警告:对于可变参数形成的数组不会报错,只会警告。可以通过@SafeVarags来取消警告
  5. 不能实例化(new)泛型类型变量
  6. 不能实例化(new)泛型数组
  7. 泛型类的静态上下文中类型变量无效
  8. 不能抛出或不会泛型类的实例
  9. 可以取消对检查型异常的检查
  10. 注意擦除后的冲突
泛型类型的继承原则

T是U的子类, 但Pair[T]不是Pair[U]的子类

image-20220911192415252

通配符类型
  1. 概念:在通配符类型中,允许参数发生改变

    Pair< ? extends T>

    只要求参数是T的子类

  2. 通配符的超类型限定

    ? super T

    限制为T的所有超类

  3. 无限定的通配符 ?

    Pair<?> 与Pair得不同点在于可以用任意Object对象调用原始Pair类的方法

  4. 通配符捕获

    在含通配符的泛型方法中构造一个不含通配符的方法,该方法可以用泛型变量捕获通配符对之进行操作

    Pair<?> 与Pair得不同点在于可以用任意Object对象调用原始Pair类的方法

  5. 通配符捕获

    在含通配符的泛型方法中构造一个不含通配符的方法,该方法可以用泛型变量捕获通配符对之进行操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值