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

问题背景:
假设需要创建一个泛型类NumericFns,用于存储数值并执行数学运算,例如计算倒数或小数部分。该类需要支持多种数字类型,如Integer、Float和Double。直接使用泛型类型参数T会导致编译错误,因为编译器无法识别T是否具有doubleValue()和intValue()方法。
解决方案:边界限定
为了解决这个问题,可以使用边界限定来限制类型参数T必须是Number类或其子类。在Java中,这通过extends关键字实现:
<code class="java">class NumericFns<T extends Number> {
T num;
NumericFns(T n) { num = n; }
double reciprocal() { return 1 / num.doubleValue(); }
double fraction() { return num.doubleValue() - num.intValue(); }
// ...
}</code>通过T extends Number,编译器知道T一定具有doubleValue()和intValue()方法,从而避免了编译错误。
示例:
<code class="java">class BoundsDemo {
public static void main(String args[]) {
NumericFns<Integer> iOb = new NumericFns<>(5);
System.out.println("iOb 的倒数是 " + iOb.reciprocal());
System.out.println("iOb 的小数部分是 " + iOb.fraction());
System.out.println();
NumericFns<Double> dOb = new NumericFns<>(5.25);
System.out.println("dOb 的倒数为 " + dOb.reciprocal());
System.out.println("dOb 的小数部分是 " + dOb.fraction());
// 下面这行代码将导致编译错误,因为String不是Number的子类
// NumericFns<String> strOb = new NumericFns<>("错误");
}
}</code>多类型参数的边界限定:
边界限定也可以应用于多个类型参数,例如Pair类:
<code class="java">class Pair<T, V extends T> {
T first;
V second;
Pair(T a, V b) { first = a; second = b; }
// ...
}</code>在这个Pair类中,V extends T表示V必须是T的子类或T本身。这确保了传递给Pair构造函数的两个参数具有兼容的类型。
示例:
<code class="java">Pair<Integer, Integer> x = new Pair<>(1, 2); // 正确 Pair<Number, Integer> y = new Pair<>(10.4, 12); // 正确,因为Integer是Number的子类 // 下面这行代码将导致编译错误,因为String不是Number的子类 // Pair<Number, String> z = new Pair<>(10.4, "12");</code>
总结:
边界限定是Java泛型中一个强大的特性,它可以有效地限制类型参数的类型,从而提高类型安全性和代码重用性。通过合理地使用边界限定,可以编写更健壮、更易维护的泛型代码。
以上就是种类有限的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号