>"和 ">>"之间的区别?-6ren"> >"和 ">>"之间的区别?-在表达式 > 中像这样的签名 public static > foo(T x) { ... } T的描述递归地依赖于Comparable . 如果T延伸Comparable ,和Comparable延-6ren">
gpt4 book ai didi

java - ">"和 ">>"之间的区别?

转载 作者:行者123 更新时间:2023-12-02 11:21:07 31 4
gpt4 key购买 nike

在表达式 <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/

31 4 0