泛型类型参数的边界限定:提升类型安全性和代码重用性
在Java泛型中,类型参数可以被任何类替换,但有时需要限制类型参数的类型,以确保类型安全性和代码重用性。本文将探讨如何使用边界限定来实现这一目标。

问题背景:
假设需要创建一个泛型类NumericFns,用于存储数值并执行数学运算,例如计算倒数或小数部分。该类需要支持多种数字类型,如Integer、Float和Double。直接使用泛型类型参数T会导致编译错误,因为编译器无法识别T是否具有doubleValue()和intValue()方法。
解决方案:边界限定
为了解决这个问题,可以使用边界限定来限制类型参数T必须是Number类或其子类。在Java中,这通过extends关键字实现:
class NumericFns{ T num; NumericFns(T n) { num = n; } double reciprocal() { return 1 / num.doubleValue(); } double fraction() { return num.doubleValue() - num.intValue(); } // ... }
通过T extends Number,编译器知道T一定具有doubleValue()和intValue()方法,从而避免了编译错误。
示例:
class BoundsDemo {
public static void main(String args[]) {
NumericFns iOb = new NumericFns<>(5);
System.out.println("iOb 的倒数是 " + iOb.reciprocal());
System.out.println("iOb 的小数部分是 " + iOb.fraction());
System.out.println();
NumericFns dOb = new NumericFns<>(5.25);
System.out.println("dOb 的倒数为 " + dOb.reciprocal());
System.out.println("dOb 的小数部分是 " + dOb.fraction());
// 下面这行代码将导致编译错误,因为String不是Number的子类
// NumericFns strOb = new NumericFns<>("错误");
}
}
多类型参数的边界限定:
边界限定也可以应用于多个类型参数,例如Pair类:
class Pair{ T first; V second; Pair(T a, V b) { first = a; second = b; } // ... }
在这个Pair类中,V extends T表示V必须是T的子类或T本身。这确保了传递给Pair构造函数的两个参数具有兼容的类型。
示例:
Pairx = new Pair<>(1, 2); // 正确 Pair y = new Pair<>(10.4, 12); // 正确,因为Integer是Number的子类 // 下面这行代码将导致编译错误,因为String不是Number的子类 // Pair z = new Pair<>(10.4, "12");
总结:
边界限定是Java泛型中一个强大的特性,它可以有效地限制类型参数的类型,从而提高类型安全性和代码重用性。通过合理地使用边界限定,可以编写更健壮、更易维护的泛型代码。










