簡體   English   中英

Java可比通用類型

[英]Java Comparable for Generic Types

嘗試比較表單中的泛型類型時

  Class<T> implements Comparable<T> {

      public int compareTo(T other){
        this.T < other
      } 
  }

對我不起作用,但是在使用時

  Class<T extends Comparable<T>>{
     T.compareTo(other.T)
  }

確實有效。 我無法用第一個例子解釋為什么我不能直接比較T

在第一個示例中:

class Foo<T> implements Comparable<T> {

您是說Foo對象具有可比性。 在第二個示例中:

class Foo<T extends Comparable<T>>{

您是說無論T是可比的。

然后,在代碼正文中,您嘗試比較T類型的事物-在第一種情況下,您不能保證它們具有可比性,在第二種情況下,您可以做得到。

我希望這兩個例子可以為您的問題提供一些啟示:

class Foo<T> implements Comparable<T> {
    @Override
    public int compareTo(T o) {
        // We don't know anything about T
        return hashCode() - o.hashCode();
    }
}

class Boo<T extends Comparable<? super T>> implements Comparable<T> {
    private T instance;

    @Override
    public int compareTo(T o) {
        // We know that T implements Comparable<? super T>
        return instance.compareTo(o);
    }
}

Foo第一種情況下,您對T類型一無所知,因此您不能在compareTo()方法中做太多事情。

但是,在Boo ,需要T來實現Comparable<? super T> Comparable<? super T> (如果您不知道通配符是什么,只需認為那里只是Comparable<T> ),因此可以調用t.compareTo(anotherT) 有關有界類型參數的更多信息。

編輯:(對野生動物的解釋)

考慮以下代碼:

class Car implements Comparable<Car> { ... }
class SportCar extends Car { ... }

現在調用sportCar1.compareTo(SportCar2)是完全合法的。 但是,沒有通配符, Bar<SportCar>是一個錯誤!

為什么? 因為SportCar 沒有實現Comparable<SportCar> 並且您需要T來實現Comparable<T> ,在這種情況下, TSportCar

但是SportCar實現Comparable<Car>CarSportCar的超類型。 因此,您想說些類似“可以將T與T或任何T的超類型進行比較”(例如,在這種情況下, SportCar可以與任何Car進行比較)。

這就是通配符的用途(在許多其他事情中)。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM