java - "<T extends Comparable<T>>"和 "<T extends Comparable<Comparable<T>>>"之间的区别?

标签 java generics interface

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

相关文章:

java - 静态工厂方法中的泛型? ( java )

java - Spring 保存语言环境并在用户登录时更改语言环境

c# - 为什么接口(interface) A 对接口(interface) B 隐藏属性

Java泛型编译错误

Java方法重写而不进行内部转换

c++ - 线程和接口(interface) C++

java - 在 Java 中将字符串转换为颜色

java - 内存不足错误在字符串上失败

java - 静态/非静态内部类 : The type parameter T is hiding the type T

Java:了解泛型数组的类型删除