Java泛型

Java泛型(Generics)是Java 5引入的一项重要特性,它允许在定义类、接口或方法时使用类型参数(Type Parameters),从而提高代码的类型安全性和重用性。


1. 泛型的基本概念

  • 目的:提供编译时类型检查,避免运行时类型转换错误(如ClassCastException)。
  • 核心思想:参数化类型,即在使用时才指定具体的类型。

2. 泛型类

  • 在类名后使用<T>定义类型参数,T可以是任意标识符(如EKV等)。
  • 示例:
    public class Box<T> {
        private T content;
        public void setContent(T content) { this.content = content; }
        public T getContent() { return content; }
    }
    
  • 使用:
    Box<String> stringBox = new Box<>();
    stringBox.setContent("Hello");
    

3. 泛型方法

  • 在方法返回类型前定义类型参数,可以独立于类的泛型参数。
  • 示例:
    public <T> void printArray(T[] array) {
        for (T item : array) {
            System.out.println(item);
        }
    }
    
  • 使用:
    Integer[] intArray = {1, 2, 3};
    printArray(intArray);
    

4. 泛型接口

  • 类似于泛型类,接口也可以定义类型参数。
  • 示例:
    public interface List<T> {
        void add(T item);
        T get(int index);
    }
    
  • 实现:
    public class ArrayList<T> implements List<T> {
        // 实现方法
    }
    

5. 类型通配符(Wildcards)

  • 用于处理未知类型的情况,使用?表示。
  • 上界通配符<? extends T>):表示类型是T或其子类。
    public void process(List<? extends Number> list) { ... }
    
  • 下界通配符<? super T>):表示类型是T或其父类。
    public void addNumbers(List<? super Integer> list) { ... }
    

6. 泛型的限制

  • 类型擦除:泛型信息在编译后会被擦除,运行时无法获取泛型的具体类型。
  • 不能实例化泛型类型:如new T()是非法的。
  • 不能使用基本类型:如List<int>是非法的,必须使用包装类List<Integer>
  • 不能创建泛型数组:如new T[10]是非法的。

7. 泛型与继承

  • 泛型类或接口的子类可以指定具体类型或保留泛型参数。
  • 示例:
    public class StringBox extends Box<String> { ... }
    

8. 泛型的实际应用

  • 集合框架:如List<T>Map<K, V>等。
  • 工具类:如Collections中的泛型方法。
  • 自定义数据结构:如链表、栈、队列等。

9. 泛型的最佳实践

  • 命名规范:使用有意义的类型参数名(如T表示类型,E表示元素,K表示键,V表示值)。
  • 避免原生类型:如List应改为List<T>
  • 优先使用泛型方法:减少代码重复。

10. 泛型的扩展

  • Java 10+的局部变量类型推断:可以使用var简化泛型声明。
    var list = new ArrayList<String>();
    

posted @ 2025-08-08 09:11  路口偶然遇见你  阅读(20)  评论(0)    收藏  举报