<T extends Comparable<T>> 是什么意思?

mpn*_*pnm 2 java generics comparable

我正在查看 Java 的 TheAlgorithms 存储库,首先找到了这个: https: //github.com/TheAlgorithms/Java/blob/master/Searches/SearchAlgorithm.java。我明白了<T extends Comparable<T>>,但我不知道这意味着什么。我只了解一点关于泛型的知识,并且我知道语法与参数类型边界有关,但是如果有人能够澄清这与Comparable<T>和 是什么Comparable<T>有什么关系,那就太好了。

这个论坛上还有一些与我的类似的其他问题,涉及实施<T extends Comparable<T>>,但答案并没有真正澄清是什么Comparable<T>

Sla*_*law 5

首先,您的Comparable界面大致如下所示:

public interface Comparable<T> {

    int compareTo(T other);
}
Run Code Online (Sandbox Code Playgroud)

可以看到, 的类型参数Comparable被用作方法的参数compareTo。通常,类型参数T是实现该Comparable接口的同一个类。这种通用设置有助于比较相同类型的实例。这是一个例子:

public class Name implements Comparable<Name> {

    @Override
    public int compareTo(Name other) {
        // compute & return result
    }
}
Run Code Online (Sandbox Code Playgroud)

现在假设您有一个方法,该方法应该根据两个对象的自然顺序返回两个对象的最大值。这样的方法可能如下所示:

public static <U extends Comparable<U>> U max(U left, U right) {
    return left.compareTo(right) >= 0 ? left : right;
}
Run Code Online (Sandbox Code Playgroud)

注意:用作U类型变量而不是T显示它与接口T中使用的变量是分开的Comparable

以上是通用方法。类型变量的U上限为Comparable<U>。这意味着用于代替 of 的类型参数U必须可分配给(即 of 的子类型)Comparable<U>。例如,如果我们使用Name类型参数,它将起作用,因为Name可分配给Comparable<Name>。指定上限 as 的原因Comparable<U>是该方法需要调用compareTo才能正常运行。

Name name1 = ...;
Name name2 = ...;

Name max = max(name1, name2); // U is inferred to be Name
Run Code Online (Sandbox Code Playgroud)

如上所示,使用U返回类型还允许将结果分配给与参数类型相同的变量。


请注意,为了获得最大的灵活性,该max方法实际上应该像这样声明:

public static <U extends Comparable<? super U>> U max(U left, U right) {
    return left.compareTo(right) >= 0 ? left : right;
}
Run Code Online (Sandbox Code Playgroud)

区别在于使用 代替Comparable<? super U>来作为上限Comparable<U>。这两个问答应该有助于解释为什么使用? super U提供了更大的灵活性: