泛型之间的差异<t extends =“”number =“”&=“”可比较<t =“”>&gt;和T扩展可比较<! - ?扩展数字 - >

时间:2016-05-26 15:25:22

标签: java generics

有人可以解释<T extends Number & Comparable<T>>T extends Comparable<? extends Number>之间的区别吗?

这些看起来与我类似,并且它们都适用于子类类型。无效类型args显示以下错误

  

类型参数不在绑定参数范围内;应该实现   'java.lang.Number中'

  

类型参数不在绑定参数范围内;应该延长   'java.lang.Comparable的&GT;'

分别

2 个答案:

答案 0 :(得分:2)

您无法使用:

Comparable<? extends Number>

因为Comparable定义的唯一方法是使用者(在PECS意义上):它需要接受? extends Number类型的实例到其{ {1}}方法 - 并且没有任何类型可以安全地满足该范围。

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

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

答案 1 :(得分:1)

  

选项1:

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

您的通用参数应该扩展数字实现Comparable, 这意味着A类是一个数字和可比较的。

  

选项2:

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

T与数字相当(只能比较数字),但不一定是数字,与选项1不同

我将通过示例解释:

<强> A

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

<强>乙

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

IntegerWrapper (选项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     公共类GenericsTest {

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

    B myB = new B<IntegerWrapper>();
  }
}

我认为选项1是您正在寻找的,因为我无法想到选项2的许多有用场景(也许有......)