有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java可与泛型类型进行比较

尝试比较表单中的泛型类型时

  Class<T> implements Comparable<T> {

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

不适用于我,但在使用时

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

确实有效。我无法用第一个例子来判断为什么不能直接比较t


共 (2) 个答案

  1. # 1 楼答案

    我希望这两个Exmaple能对你的问题有所帮助:

    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)。更多关于bounded type parameters

    编辑:(威尔德解释)

    考虑以下代码:

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

    现在打电话sportCar1.compareTo(SportCar2)是完全合法的。然而,如果没有通配符, Bar<SportCar>是一个cpomfile错误

    为什么?因为SportCar没有实现Comparable<SportCar>。您需要T来实现Comparable<T>,在本例中TSportCar

    但是SportCar实现了Comparable<Car>CarSportCar的一个超类型。所以你想说“T可以与T或T的任何超类型相比较”(比如在这个例子中SportCar可以与任何Car相比较)

    这就是通配符的用途(还有很多其他用途)。希望这有帮助

  2. # 2 楼答案

    在第一个例子中:

    class Foo<T> implements Comparable<T> {
    

    你是说Foo对象是可比较的。在第二个例子中:

    class Foo<T extends Comparable<T>>{
    

    你是说无论T是什么,都是可比的

    然后,在代码主体中,尝试比较T类型的东西。在第一种情况下,你不能保证它们是可比较的,在第二种情况下,你可以