📜  Java中具有泛型的有界类型

📅  最后修改于: 2020-02-12 15:02:34             🧑  作者: Mango

有界类型参数

有时您可能想限制可以在参数中用作参数的数据类型。例如,对数字进行操作的方法可能只希望接受Number或其子类的实例。这就是有界类型参数的用途。

  • 有时我们不希望整个类都被参数化,在这种情况下,我们可以创建Java 泛型方法。由于构造函数是一种特殊的方法,因此我们也可以在构造函数中使用泛型类型。
  • 假设我们要限制可以在参数化类型中使用的对象的类型。例如,在比较两个对象的方法中,我们要确保接受的对象是可比较的。
  • 这些方法的调用与无界方法类似,不同之处在于,如果我们尝试使用任何非Comparable的类,则会引发编译时错误。

声明一个有界类型参数

    1. 列出类型参数的名称。
    2. 使用extends关键字。
    3. 并按其上限(在下面的示例中为A)传参

语法

请注意,在这种情况下,extends通常用于表示“ extends”(如在类中)。同样,T只能由superClassName或superClassName的子类替换。因此,超类定义了一个包含性的上限
让我们举一个例子,说明如何使用泛型实现有界类型(扩展超类)。

// 这个类接受A或者A的子类.
// 传入其他类会在编译时报错
class Bound
{
    private T objRef;
    public Bound(T obj){
        this.objRef = obj;
    }
    public void doRunTest(){
        this.objRef.displayClass();
    }
}
class A
{
    public void displayClass()
    {
        System.out.println("在超类A内");
    }
}
class B extends A
{
    public void displayClass()
    {
        System.out.println("在子类B内");
    }
}
class C extends A
{
    public void displayClass()
    {
        System.out.println("在子类C内");
    }
}
public class BoundedClass
{
    public static void main(String a[])
    {
        // 创建子类C,传入
        Bound bec = new Bound(new C());
        bec.doRunTest();
        // 创建子类B,传入
        Bound beb = new Bound(new B());
        beb.doRunTest();
        // 传入超类A
        Bound bea = new Bound(new A());
        bea.doRunTest();
    }
}

输出:

在子类C内
在子类B内
在超类A内

现在,我们仅限于类型A及其子类,因此它将对任何其他类型或子类引发错误。

输出:

error: type argument String is not within bounds of type-variable T

多个范围

绑定类型参数可以与方法以及类和接口一起使用。
Java泛型也支持多个范围。在这种情况下,A可以是接口或类。如果A是类,则B和C应该是接口。在多个范围内,我们不能有多个类。
语法

 

输出:

在超类A内