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
的要求不是由静态类型强制执行的。
两个原因:
Set<T>
接口中不存在该(假设的)类型约束,因此 Set<Number>
完全有效。
并非 TreeSet 的所有用例都需要这样做;例如TreeSet
用 Comparator
实例化的实例不需要元素实现 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
希望对您有所帮助!
我们要添加到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
的要求不是由静态类型强制执行的。
两个原因:
Set<T>
接口中不存在该(假设的)类型约束,因此Set<Number>
完全有效。并非 TreeSet 的所有用例都需要这样做;例如
TreeSet
用Comparator
实例化的实例不需要元素实现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
希望对您有所帮助!