繁体   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