Java可比较通用类型

时间:2014-08-07 17:40:46

标签: java comparable

尝试比较

形式的泛型类型时
  Class<T> implements Comparable<T> {

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

对我来说不起作用,但在使用时

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

确实有效。我一直无法消除为什么我不能直接使用第一个例子来比较T

2 个答案:

答案 0 :(得分:4)

在你的第一个例子中:

class Foo<T> implements Comparable<T> {

您说Foo个对象具有可比性。在你的第二个例子中:

class Foo<T extends Comparable<T>>{

你说的是,无论T是什么,它都具有可比性。

然后,在您的代码正文中,您尝试比较T类型的内容 - 在第一种情况下,您无法保证它们具有可比性,在第二种情况下,您可以做到。

答案 1 :(得分:1)

我希望这两个exmaples能够解决你的问题:

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>(如果您不知道wildcards是什么,只需认为只有Comparable<T> t.compareTo(anotherT) 1}}),所以你可以拨打class Car implements Comparable<Car> { ... } class SportCar extends Car { ... } 。有关bounded type parameters的更多信息。

编辑:(Wildard解释)

请考虑以下代码:

sportCar1.compareTo(SportCar2)

现在致电Bar<SportCar>完全合法。但是,没有通配符, SportCar是一个cpompile错误!

为什么呢?因为Comparable<SportCar> 没有实施T。您需要Comparable<T>来实施T,在这种情况下,SportCarSportCar

但是Comparable<Car>实现CarSportCarSportCar的超类型。所以你想说类似于&#34; T可以与T或T&#34;的任何超类型进行比较。 (在这种情况下,Car可以与任何{{1}}进行比较。

这是通配符的用途(在许多其他事情中)。希望这会有所帮助。