加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

理解java中的有界泛型.有什么意义?

发布时间:2020-12-15 04:27:40 所属栏目:Java 来源:网络整理
导读:我试图理解有界类型,而不是完全理解它们的观点. 在https://docs.oracle.com/javase/tutorial/java/generics/bounded.html上有一个有界泛型的例子,提供了这个用例: public class NaturalNumberT extends Integer { private T n; public NaturalNumber(T n) {
我试图理解有界类型,而不是完全理解它们的观点.

在https://docs.oracle.com/javase/tutorial/java/generics/bounded.html上有一个有界泛型的例子,提供了这个用例:

public class NaturalNumber<T extends Integer> {

    private T n;

    public NaturalNumber(T n)  { this.n = n; }

    public boolean isEven() {
        return n.intValue() % 2 == 0;
    }

    // ...
}

如果要限制可以作为参数化类型的类,为什么不要忘记参数化,并且具有:

public class NaturalNumber {

    private Integer n;

    public NaturalNumber(Integer n)  { this.n = n; }

    public boolean isEven() {
        return n.intValue() % 2 == 0;
    }

    // ...
}

然后,任何扩展/实现Integer的类都可以与此类一起使用.

另外,还有一个问题:当Java Integer类最终时,T扩展Integer是如何在第一个例子中扩展的?

谢谢.

解决方法

How is T extending Integer in the first example when the Java Integer class is final?

T只能是整数,所以这里的“延伸”纯粹是象征性的. (我从侧面说明开始,因为实际上,这是一个泛型无用的例子.我真的不知道为什么教程认为这是一个信息性的演示.它不是.)

假设T扩展了数字:

class Example<T extends Number> {
    private T num;

    void setNum(T num) { this.num = num; }
    T    getNum()      { return num;     }
}

因此,泛型一般来说,你可以这样做:

Example<Integer> e = new Example<>();
e.setNum( Integer.valueOf(10) );
// returning num as Integer
Integer i = e.getNum();
// and this won't compile
e.setNum( Double.valueOf(10.0) );

泛型是parametric polymorphism的一种形式,本质上它允许我们重用代码,并对所涉及的类型有一般性.

那一定是什么意思?

这里的绑定意味着T必须是Number或Number的子类,所以我们可以在T的实例上调用Number的方法.不幸的是,Number是一个通常无用的基类(由于精度问题),但它可能让我们做一些有趣的事情:

class Example<T extends Number> extends Number {
//                              ^^^^^^^^^^^^^^
    ...
    @Override
    public int intValue() {
        return num.intValue();
    }
    // and so on
}

例如,更常见的是找到T extends Comparable< T>.这让我们用T做一些更有意义的事情.我们可能有类似的东西:

// T must be a subclass of Number
// AND implement Comparable
Example<T extends Number & Comparable<T>>
        implements Comparable<Example<T>> {
    ...
    @Override
    public int compareTo(Example<T> that) {
        return this.num.compareTo(that.num);
    }
}

现在我们的Example类具有自然顺序.我们可以对它进行排序,即使我们不知道T体内究竟是什么.

如果我们结合这些概念,那:

>泛型允许“外部世界”指定实际类型和
>界限允许“内部世界”使用共性,

我们可以构建如下构造:

static <T extends Comparable<T>> T min(T a,T b) {
    return (a.compareTo(b) < 0) ? a : b;
}

{
    // returns "x"
    String s = min("x","z");
    // returns -1
    Integer i = min(1,-1);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读