泛型程序设计详解

泛型程序设计

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

避免继承的强制类型转化

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

简单泛型类

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. 通配符捕获

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

posted @   chanxe  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示