我正在研究java中的集合并且在理解以下内容时卡住了。它是从khalid mughal的scjp中获取的(复习问题15.37)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class WhatIsThis {
public static void main(String[] args) {
List<StringBuilder> list = new ArrayList<StringBuilder>();
list.add(new StringBuilder("B"));
list.add(new StringBuilder("A"));
list.add(new StringBuilder("C"));
Collections.sort(list, Collections.reverseOrder());
System.out.println(list.subList(1,2));
}
}
选择一个正确答案。
一个。程序将在运行时编译并打印以下内容:[B]。
湾运行时程序将编译并打印以下内容:[B,A]
C。程序将编译,但在运行时抛出异常
d。该程序将无法编译。
以下是答案 -
(c)中 StringBuilder类不实现Comparable接口。排序() 采用比较器的方法不会对电子产品提出任何此类要求。 类型。程序编译,但抛出ClassCastException,如String- 无法以反向自然顺序比较构建器对象。
我无法理解答案。有人可以帮帮我吗?
答案 0 :(得分:4)
你看过documentation for Collections.sort
吗?
根据元素的自然顺序,将指定列表按升序排序。列表中的所有元素都必须实现Comparable接口。此外,列表中的所有元素必须是可相互比较的(即,e1.compareTo(e2)不得对列表中的任何元素e1和e2抛出ClassCastException。)
和
<强>抛出:强>
ClassCastException - 如果列表包含不可相互比较的元素(例如,字符串和整数)。
这对你有帮助吗?基本上,为了对列表进行排序,sort
必须将StringBuilder
值相互比较 - 并且StringBuilder
中没有声明自然比较。
答案 1 :(得分:0)
List正在保存类型为StringBuilder的对象。
当尝试排序时,sort方法需要比较元素来决定顺序,它通过将元素视为Comparable来实现,它会尝试将它们强制转换为Comparable类型。由于String Builder未实现该接口,因此强制转换将失败并抛出异常。