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

泛型<T extends Number&Comparable<T>>和T extend Comparable之间的区别?扩展数>

  •  1
  • s7vr  · 技术社区  · 10 年前

    有人能解释一下 <T extends Number & Comparable<T>> T extends Comparable<? extends Number> ?

    这些看起来和我很相似,它们都可以很好地编译子类类型。无效的类型参数显示以下错误

    类型参数不在绑定参数内;应该实施 'java.lang.Number'

    类型参数不在绑定参数内;应该延长 'java.lang.Comparable>'

    分别地

    2 回复  |  直到 10 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    您将无法使用:

    Comparable<? extends Number>
    

    因为只有 Comparable 消费者 (在意义上 PECS ):它需要接受类型为的实例 ? extends Number 到它的 compareTo 方法-并且没有类型可以安全地满足该界限。

    Integer 是一个 Comparable<? extends Number> ,但也是 Double 因此,您无法安全地拨打 instance1.compareTo(instance2) 因为如果这些实例是具体的,它就会失败 整数 双重的 分别,因为 Integer.compareTo 只能接受 整数 参数。

    因此,编译器首先会阻止您调用此方法。

        2
  •  2
  •   Elia Rohana    10 年前

    选项1:

    public class A <T extends Number & Comparable<T>>{}
    

    通用参数应扩展Number 实现了可比性, 这意味着A类是一个数字和可比性。

    选项2:

    public class B <T extends Comparable<? extends Number>>{}
    

    T在数字上是Comparable(只能比较数字),但不必是数字,这与选项1不同

    我将举例说明:

    A.

    公共A类<T扩展数字;类似<T>>{}
    

    B

    公共类B<T扩展可比<?扩展数字>>{}
    

    整数包装器 (选项2)

        public class IntegerWrapper implements Comparable<Integer>  {
    
          Integer number;
    
          public IntegerWrapper(int number) {
            this.number = number;
          }
    
          @Override
          public int compareTo(Integer o) {
            return number.compareTo(o);
          }
        }
    

    通用测试 公共类GenericsTest{

      public static void main(String args[]){
        A myA = new A<Integer>();
    
        B myB = new B<IntegerWrapper>();
      }
    }
    

    我认为选项1就是你要找的,因为我想不出选项2有多少有用的场景(也许有……)