如何在Java中定义和使用泛型类

泛型类通过类型参数(如T)实现类型安全和代码复用,例如Box可指定存储类型,编译器在实例化时进行类型检查,避免运行时错误;支持多参数如Pair,并可用extends限定上界确保类型约束,提升灵活性与安全性。

在Java中,泛型类允许你编写可以处理多种数据类型的类,同时保持类型安全。通过使用泛型,你可以避免运行时的类型转换错误,并提升代码的可重用性。

定义泛型类

定义一个泛型类时,在类名后添加类型参数,通常用尖括号⟨T⟩包围。这里的T代表“Type”,也可以使用其他字母如EKV等。

例如,定义一个简单的泛型容器类:

public class Box {
    private T value;

    public void set(

T value) {
        this.value = value;
    }

    public T get() {
        return value;
    }
}

这里Box表示这个类可以存储任何类型的对象,具体类型在创建实例时指定。

使用泛型类

创建泛型类的实例时,需要指定具体的类型。编译器会根据你传入的类型自动进行类型检查。

示例:创建一个只存储字符串的盒子

Box stringBox = new Box();
stringBox.set("Hello World");
String content = stringBox.get(); // 无需强制转换

如果你尝试放入非字符串类型:

stringBox.set(123); // 编译错误!

这会在编译阶段就被发现,避免了运行时错误。

使用多个类型参数

泛型类可以支持多个类型参数。比如定义一个键值对容器:

public class Pair {
    private K key;
    private V value;

    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public K getKey() { return key; }
    public V getValue() { return value; }
}

使用方式:

Pair pair = new Pair("age", 25);
System.out.println(pair.getKey() + ": " + pair.getValue());

限定类型参数

有时你希望泛型类只能接受特定类型的子类。可以通过extends关键字设置上界。

例如,只允许数字类型(Number的子类):

public class NumberBox {
    private T number;

    public void set(T number) { this.number = number; }

    public double getDoubleValue() {
        return number.doubleValue();
    }
}

这样就只能传入IntegerDoubleNumber的子类:

NumberBox intBox = new NumberBox();
intBox.set(100);
System.out.println(intBox.getDoubleValue()); // 输出 100.0

但传入String会报错:

NumberBox strBox = new NumberBox(); // 编译错误!

基本上就这些。泛型类让Java代码更灵活、更安全。只要在定义时明确类型参数,使用时就能享受自动类型检查和无需强转的便利。