This question already has answers here:
Java- The meaning of <T extends Comparable<T>>?
                                
                                    (7个答案)
                                
                        
                                上个月关闭。
            
                    
我正在查看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>是什么。

最佳答案

首先,您具有Comparable界面,大致类似于:

public interface Comparable<T> {

    int compareTo(T other);
}


如您所见,Comparable的类型参数用作compareTo方法的参数。通常,T的type参数是与实现Comparable接口的类相同的类。这种通用设置有助于将相同类型的实例彼此进行比较。这是一个例子:

public class Name implements Comparable<Name> {

    @Override
    public int compareTo(Name other) {
        // compute & return result
    }
}


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

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


注意:使用U作为类型变量而不是T表示它与T界面中使用的Comparable是分开的。

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

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

Name max = max(name1, name2); // U is inferred to be Name


如上所示,将max作为返回类型还可以将结果分配给与参数类型相同的变量。



请注意,为获得最大的灵活性,实际上应像下面这样声明Comparable<? super U>方法:

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


区别在于使用Comparable<U>作为上限,而不是使用? super U。这两个问答可以帮助解释为什么使用<T extends Comparable<? super T>>提供更大的灵活性:


What is PECS (Producer Extends Consumer Super)?
Explanation of generic in collection.sort/ comparable code?

关于java - <Textended Comparable <T >>是什么意思? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58705143/

10-12 20:49