理解java中的有界泛型.有什么意义?
我试图理解有界类型,而不是完全理解它们的观点.
在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是如何在第一个例子中扩展的? 谢谢. 解决方法
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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |