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

时间:2015-05-31 06:02:17

标签: java collections wrapper comparable

我们要添加到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);

2 个答案:

答案 0 :(得分:2)

你是对的

  

Class必须实现Comparable接口。

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

$cookie

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

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

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

 Number n1= 11;

希望这有帮助!

答案 1 :(得分:1)

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

有两个原因:

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

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

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

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