【问题标题】:Why object of number can be added in TreeSet为什么可以在 TreeSet 中添加数字对象
【发布时间】:2015-08-13 18:49:52
【问题描述】:

我们要添加到 TreeSet 中的类的对象,该类必须实现 Comparable 接口 但是 Number 类没有实现 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's。
  • 为什么你认为 Collection 的元素需要实现 Comparable 接口?
  • 我在 TreeSet 中尝试了带有类 T(它不实现 Comparable 接口)的相同程序,它抛出了 java.lang.ClassCastException。但是在上面的程序中,我使用了没有实现 Comparable 接口的 Number 仍然可以正常工作。这两件事是矛盾的。在一种情况下,它正在使用一个不实现 Comparable 接口的类,但在另一种情况下,它不是。

标签: java collections wrapper comparable


【解决方案1】:

你是对的

类必须实现 Comparable 接口。

在您的示例中,上述语句是有效的。 Number 有子类 Integer,当我们这样做时:

 Number n1= 11;

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

您也可以在 java doc 中看到这一点。 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  

希望对您有所帮助!

【讨论】:

  • 感谢@Learner。现在我明白了,当我们使用 Number n1 =11 创建对象时;它实际上创建了整数对象。和 Interger 类实现 Comparable 接口
【解决方案2】:

您的代码编译时不会出错,因为静态类型不强制要求 Treeset 的元素实现 Comparable

两个原因:

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

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

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


正如@learner 指出的那样,您的代码将实际运行。那是因为您的Number 对象实际上是Integer 实例,而Integer 实现了Comparable&lt;Integer&gt;

【讨论】:

    猜你喜欢
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多