在表达式 <T extends Comparable<T>>
中像这样的签名
public static <T extends Comparable<T>> foo(T x) { ... }
T
的描述递归地依赖于Comparable<T>
.
如果T
延伸Comparable<T>
,和Comparable<T>
延伸Comparable<Comparable<T>>
,这不是T
吗?延伸Comparable<Comparable<T>>
?
IOW,是extends
关系传递?
如果是这样,为什么不是
public static <T extends Comparable<Comparable<T>>> int compare(T x, T y) {
return x.compareTo(y);
}
相当于
public static <T extends Comparable<T>> int compare(T x, T y) {
return x.compareTo(y);
}
?事实上,最后一个定义可以编译,而上面的定义则无法编译,并出现错误
comp.java:7: compareTo(java.lang.Comparable<T>) in
java.lang.Comparable<java.lang.Comparable<T>> cannot be applied to (T)
return x.compareTo(y);
谢谢!
最佳答案
我认为您在这里进行了错误的逻辑跳转。
T extends Comparable<T>
不暗示这一点
Comparable<T> extends Comparable<Comparable<T>>
<小时/>
简短类比:
假设岩石 splinter 机是任何可以 splinter 岩石的 Material ,而岩石恰好能够 splinter 自身。所以岩石是一种岩石 splinter 机。这是否意味着岩石可以粉碎任何可以粉碎岩石的物质?显然不是:钢也可能是岩石 splinter 机,而岩石可能不会压碎钢。
<小时/>长(基于代码的)类比:
假设我有一个界面,Additive<T>
,它可用于描述您可以执行 add
的任何类型。 T
上的操作对象并取回 T
.
现在假设我有一些方法,其签名如下所示:
public static <T extends Additive<T>> add(T x, T y) { ... }
自 x
必须是我可以添加 T
的类型,该方法可以实现如下:
return x.add(y);
有道理吗?太好了;但现在让我们做出您在问题中所做的假设: Additive<T>
必须延长Additive<Additive<T>>
;如果是这种情况,那么我可以假设我可以添加到 x
任何类型实现 Additive<T>
的实例.
这就是假设不成立的地方。我可能有一种类型,比如说......
// A 32-bit integral number supporting addition
public class Int32 implements Additive<Int32> { ... }
这是有道理的,对吧?我也可以有这样的东西:
// A list of 32-bit integral numbers supporting appending
public class Int32List implements Additive<Int32> { ... }
现在,如果T extends Additive<T>
暗示 Additive<T> extends Additive<Additive<T>>
那么我应该能够做到这一点:
Additive<Int32> x = new Int32(5);
Additive<Int32> y = x.add(new Int32List());
这有意义吗?
关于java - "<T extends Comparable<T>>"和 "<T extends Comparable<Comparable<T>>>"之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6949760/