Java的泛型

Java 的泛型(Generics)是一种编程技术,它允许类、接口和方法在定义时使用参数化类型。通过泛型,可以编写更加通用和类型安全的代码。以下是 Java 泛型的一些关键知识点:

1. 泛型类(Generic Class)

  • 定义泛型类时,使用尖括号 <> 来声明类型参数。例如:
    public class Box {
        private T t;
    
        public void set(T t) { this.t = t; }
        public T get() { return t; }
    }
    
  • 这里的 T 是一个类型参数,可以在实例化类时指定具体的类型。例如:
    Box integerBox = new Box<>();
    

2. 泛型方法(Generic Method)

  • 泛型方法可以在普通类中定义,使用类型参数来指定方法的参数或返回值类型。例如:
    public  T genericMethod(T[] array) {
        return array[0];
    }
    
  • 调用时,编译器会根据传入的参数推断类型参数。

3. 泛型接口(Generic Interface)

  • 泛型接口的定义与泛型类类似,可以包含类型参数。例如:
    public interface Pair {
        K getKey();
        V getValue();
    }
    
  • 实现接口时可以指定具体的类型参数。

4. 类型参数的约束(Bounded Type Parameters)

  • 可以使用 extends 关键字对类型参数进行约束,限制其必须是某个类或接口的子类型。例如:
    public class Box {
        private T t;
        // ...
    }
    
  • 这里的 T 必须是 Number 或其子类,如 IntegerDouble 等。

5. 通配符(Wildcards)

  • 通配符 ? 用于表示未知类型,常用于泛型方法的参数中。例如:
    public void printList(List list) {
        for (Object elem : list) {
            System.out.println(elem);
        }
    }
    
  • 通配符可以有上下界约束,如  表示上限为 T 表示下限为 T

6. 类型擦除(Type Erasure)

  • Java 的泛型是编译时特性,编译后的字节码中类型参数会被擦除,替换为实际的类型(或 Object),并在必要时插入类型转换代码。例如:
    Box box = new Box<>();
    box.set(123);
    Integer i = box.get();
    
  • 编译后,类型参数 Integer 会被擦除,实际运行时类似如下代码:
    Box box = new Box();
    box.set(123);
    Integer i = (Integer) box.get();
    

7. 泛型的限制

  • 不能实例化类型参数,例如 new T() 是不允许的。
  • 不能使用基本类型(如 int)作为类型参数,必须使用包装类(如 Integer)。
  • 不能创建泛型类型的数组,例如 new T[10] 是不允许的。

8. 泛型的多态性

  • 泛型类和接口可以继承或实现其他泛型类或接口,从而形成泛型多态性。例如:
    public class OrderedPair implements Pair {
        private K key;
        private V value;
        // ...
    }
    

总结

Java 泛型提供了强大的类型安全性和代码复用性。通过泛型,可以编写更加通用、类型安全的代码,减少类型转换和运行时错误。理解泛型的核心概念(如类型参数、约束、通配符和类型擦除)是掌握泛型编程的关键。

你可能感兴趣的:(java,windows,开发语言)