TreeSet中为什么可以添加数字对象

Why object of number can be added in TreeSet

我们要添加到TreeSet中的class的对象,Class必须实现Comparable接口 但是 Number class 没有实现 Comparable 那么 TreeSet 如何允许添加 Number。

    Number n1= 11;
    Number n2= 12;
    Number n3= 13;
    Set<Number> set = new TreeSet<>();
    set.add(n1);
    set.add(n2);
    set.add(n3);

您的代码编译没有错误,因为 Treeset 的元素实现 Comparable 的要求不是由静态类型强制执行的。

两个原因:

  1. Set<T> 接口中不存在该(假设的)类型约束,因此 Set<Number> 完全有效。

  2. 并非 TreeSet 的所有用例都需要这样做;例如TreeSetComparator 实例化的实例不需要元素实现 Comparable。因此, TreeSet 类型参数也不存在类型约束。 (检查 javadoc!)

无论如何,限制是通过运行时间检查实现的,而不是通过编译时键入。


正如@learner 指出的那样,您的代码实际上会 运行。那是因为您的 Number 对象实际上是 Integer 个实例,并且 Integer 实现了 Comparable<Integer>.

你是对的

Class must implement Comparable interface.

在您的示例中,上述陈述是有效的。数字有子 class 整数,当我们这样做时:

 Number n1= 11;

在运行时它创建 Integer 对象并且 Integer 实现 Comparable。

您也可以在 java 文档中看到这一点。 here

或 我们也可以用这样的程序来证明:

Number n1 = 10;
System.out.println(n1 instanceof Number);   //true  
System.out.println(n1 instanceof Integer);  //true  
System.out.println(n1 instanceof Comparable);   //true  

希望对您有所帮助!