Java高级特性-受限类型参数

本文介绍了Java中的受限类型参数,如何通过extends和super关键字限制类型参数,确保只接受特定类型的实例,以及如何在泛型方法和类中应用这种特性,提升代码的安全性和可复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java高级特性-受限类型参数

你有时可能需要限制类型参数的类型。例如,我们可能希望创建一个操作数字的类,并希望确保只有数字类型可以作为类型参数。这可以通过使用受限类型参数来实现。

受限的类型参数

以文章开始的举例来实现,想严格限制类型参数的类型是数字类型。要实现这样的类型限制,需要使用extends关键字,后跟要继承的类或要实现的接口类型来定义。

例如:

public class NumberBox<T extends Number> {
  private T obj;

  public void set(T obj) { this.obj = obj; }
  public T get() { return this.obj;}
}

在上面这个例子中,T 必须是 Number 或者 Number 的子类,如 Integer、Float 等。如果你尝试使用非 Number 类型来实例化 NumberBox,编译器将会报错。

例如,以下代码是合法的:

NumberBox<Integer> integerBox = new NumberBox<>();
integerBox.set(Integer.valueOf(25));
Integer someInteger = integerBox.get();

但是,以下代码将会导致编译错误:

NumberBox<String> stringBox = new NumberBox<>(); // 错误,String 不是 Number 的子类

这就是 Java 中受限的类型参数的基本用法。

多个界限的类型参数

Java泛型还支持多个界限。

<T extends B1 & B2 & B3>

这个定义中,类型 T 有多个界限 B1, B2, B3 ,表示类型 T 必须同时是 B1, B2, B3 的子类型。例如:

class A { /* ... */ }
interface B { /* ... */ }
interface C { /* ... */ }

class D <T extends A & B & C> { /* ... */ }

这里需要注意的一点是,类 A 必须写在第一个,若 A 不写在第一个,编译器就或提示错误。

class D <T extends B & A & C> { /* ... */ }  // compile-time error

泛型方法与受限类型参数

Java中的泛型方法允许方法独立于类定义其自己的类型参数。这是通过在方法的修饰符(例如 public, static)和返回类型之间放置一个类型参数部分来完成的。

受限类型参数是Java泛型的一个特性,它允许你在定义泛型类型或泛型方法时,限制类型参数必须继承自特定的类,或者实现特定的接口。

先看一个示例:

public static <T> int countGreaterThan(T[] anArray, T elem) {
    int count = 0;
    for (T e : anArray)
        if (e > elem)  // compiler error
            ++count;
    return count;
}

代码中通过 > 符号进行类型比较,直接使用 > 符号进行比较的只能是原始类型(short, int, double, long, float, byte 和 char)。要比较引用类型,必须让这个类型实现 Comparable 接口。

public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem) {
    int count = 0;
    for (T e : anArray)
        if (e > elem)
            ++count;
    return count;
}

受限类型参数下限

泛型受限类型参数可以分为两种类型:上限和下限。上限限制了泛型参数的类型必须是某个类或其子类,而下限则限制了泛型参数的类型必须是某个类或其父类。这两种限制都可以通过使用extendssuper关键字来实现。

上述的受限类型参数讲述的是 extends 关键字限制了类型的上限,接着我们看下 super 关键字限制的类型的下限。

受限类型参数下限(Lower Bounded Wildcards)是 Java 泛型的一个特性,它允许你限制未知类型参数必须是特定类型的超类型。这是通过使用通配符 ? 和 super 关键字来声明的。例如,List<? super Integer> 表示一个只能包含 Integer 及其父类型的列表。

public static void addNumbers(List<? super Integer> list) {
    for (int i = 1; i <= 10; i++) {
        list.add(i);
    }
}

在这个例子中,addNumbers 方法接受一个参数 list,这个参数的类型是 List<? super Integer>,表示这个列表可以包含 Integer 及其父类型的对象。这样,我们就可以在方法内部安全地向列表中添加 Integer 对象。

这里的 ? 是通配符,将在下一篇文章中讲述。

结论

Java泛型受限类型参数是一种非常有用的技术,它可以让我们编写更加安全和可靠的代码。通过限制泛型参数的类型,我们可以避免一些类型错误和运行时异常,同时也可以让我们编写更加通用和可重用的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VoidHope

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值