泛型类的基本定义与语法
在Java中,泛型类是一种允许在类级别定义类型参数的机制,它使得类能够操作多种数据类型,同时在编译时提供类型安全检查,泛型类的定义通过在类名后添加尖括号<>来实现,尖括号内包含一个或多个类型参数,通常使用大写字母表示,如T、E、K、V等,一个简单的泛型类Box可以这样定义:

public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
这里,T是一个类型参数,代表任意类型,在创建Box实例时,可以指定具体的类型,如Box<String>或Box<Integer>,从而确保content字段的类型安全。
泛型类的类型参数约束
虽然泛型类可以接受任意类型,但有时需要对类型参数施加约束,例如限制类型必须实现某个接口或继承某个类,Java通过extends关键字实现类型参数的上限约束,以下泛型类NumberContainer限制类型参数T必须是Number的子类:
public class NumberContainer<T extends Number> {
private T number;
public void setNumber(T number) {
this.number = number;
}
public double getDoubleValue() {
return number.doubleValue();
}
}
这样,NumberContainer只能接受Integer、Double等Number的子类类型,而拒绝String等不相关类型,增强了代码的健壮性。
泛型类中的方法与成员变量
泛型类的方法可以直接使用类定义的类型参数,也可以定义自己的类型参数,在Box类中,可以添加一个泛型方法compare:

public class Box<T> {
// ... 其他成员 ...
public <U> boolean compare(Box<U> otherBox) {
return this.content.equals(otherBox.getContent());
}
}
这里,<U>是方法的类型参数,与类的类型参数T相互独立,泛型类的成员变量类型必须与类定义的类型参数一致,不能直接使用具体类型(除非通过通配符或约束)。
通配符的使用与边界
通配符是泛型中的重要概念,用于表示未知类型,通配符分为无界通配符、上界通配符? extends T和下界通配符? super T,以下方法可以接受任意类型的Box:
public static void printBoxContent(Box<?> box) {
System.out.println(box.getContent());
}
而以下方法限制Box的类型必须是Number的子类:
public static void printNumberBox(Box<? extends Number> box) {
System.out.println(box.getContent());
}
通配符的使用场景需要根据实际需求选择,过度使用可能导致类型信息丢失,因此需谨慎设计。

泛型类的继承与实现
泛型类可以继承其他泛型类或非泛型类,也可以实现接口。ColorBox继承Box并添加颜色属性:
public class ColorBox<T> extends Box<T> {
private String color;
public ColorBox(String color, T content) {
super(content);
this.color = color;
}
public String getColor() {
return color;
}
}
泛型类可以实现泛型接口,例如Comparable<T>,从而支持对象间的比较。
泛型类是Java中实现类型安全和代码复用的重要工具,通过定义类型参数、施加约束、使用通配符以及合理设计继承关系,可以编写出更加灵活、健壮的代码,掌握泛型的核心概念和最佳实践,有助于提升代码的可读性和可维护性,避免运行时类型转换异常,在实际开发中,应根据业务场景选择合适的泛型设计,避免过度复杂化代码结构。


















