我们要添加到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);
答案 0 :(得分:2)
你是对的
Class必须实现Comparable接口。
在您的示例中,上述声明有效。 Number有子类Integer,当我们这样做时:
$cookie
在运行时,它创建Integer对象,Integer实现Comparable。
您也可以在java doc中看到这一点。 here
OR 我们也可以用这样的程序证明:
Number n1= 11;
希望这有帮助!
答案 1 :(得分:1)
您的代码编译没有错误,因为要求Treeset
实现Comparable
的元素不是通过静态类型强制执行的。
有两个原因:
Set<T>
界面中不存在(假设的)类型约束,因此Set<Number>
完全有效。
并非TreeSet的所有用例都需要这样;例如使用TreeSet
实例化的Comparator
个实例不要求元素实现Comparable
。因此,TreeSet
类型参数上也不存在类型约束。 (检查javadoc!)
无论如何,限制是通过运行时检查实现的,而不是通过编译时输入实现的。
正如@learner指出的那样,你的代码实际上会运行。这是因为您的Number
个对象实际上是Integer
个实例,而Integer
实现了Comparable<Integer>
。