代码之家  ›  专栏  ›  技术社区  ›  Mushy

Java可与泛型类型相比较

  •  0
  • Mushy  · 技术社区  · 10 年前

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

      Class<T> implements Comparable<T> {
    
          public int compareTo(T other){
            this.T < other
          } 
      }
    

    不适用于我,但在使用

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

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

    2 回复  |  直到 10 年前
        1
  •  4
  •   Patrick Collins    10 年前

    在第一个示例中:

    class Foo<T> implements Comparable<T> {
    

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

    class Foo<T extends Comparable<T>>{
    

    你在说什么 T 是的,这是可比的。

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

        2
  •  1
  •   kajacx    10 年前

    我希望这两位前任能给你的问题带来一些启示:

    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> 是cpompile错误!

    为什么?因为 SportCar 使生效 Comparable<SportCar> 。您需要 T 实施 可比<T> ,在这种情况下 T 跑车 .

    但是 跑车 工具 Comparable<Car> Car 是的超类型 跑车 。所以你想说“T可以与T或T的任何超类型进行比较”(比如在本例中 跑车 可以与任何 汽车 ).

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