我在Java程序中收到以下错误:
Exception in thread "main" java.lang.ClassCastException: class java.util.ArrayList$SubList cannot be cast to class java.util.ArrayList (java.util.ArrayList$SubList and java.util.ArrayList are in module java.base of loader 'bootstrap')
以下是我正在使用的方法。
public static ArrayList<Integer> dups(ArrayList<Integer> myList) {
ArrayList<Integer> duplicates = new ArrayList<Integer>();
for (int i = 0; i < myList.size(); i++) {
ArrayList<Integer> auxiliar = new ArrayList<Integer>();
auxiliar = (ArrayList<Integer>) myList.subList(i + 1, myList.size() - 1);
if (auxiliar.contains(myList.get(i)) && !(duplicates.contains(myList.get(i)))) {
duplicates.add(myList.get(i));
}
}
return duplicates;
} // End of method
是什么原因造成的?感谢您的帮助。
代码在几个地方错过了安全键入。
我建议针对接口而不是具体类进行编程。使用变量的接口类型,并使用具体类创建和实现它们,如下面的duplicates
。
通过这种方式,您可以在以后更改实现,并编写更强大的方法。现在CCD_ 2可以被分配给CCD_。
public static List<Integer> dups(List<Integer> myList) {
List<Integer> duplicates = new ArrayList<>();
for (int i = 0; i < myList.size(); i++) {
List<Integer> auxiliar = myList.subList(i + 1, myList.size() - 1);
if (auxiliar.contains(myList.get(i)) && !duplicates.contains(myList.get(i)))) {
duplicates.add(myList.get(i));
}
}
return duplicates;
}
您也可以对重复项使用Set
。这将提高正确性;考虑三个相同的元素。
public static Set<Integer> dups(List<Integer> myList) {
文档告诉方法subList()
返回一个List<E>
。
public static List<Integer> dups(ArrayList<Integer> myList) {
ArrayList<Integer> duplicates = new ArrayList<>();
for (int i = 0; i < myList.size(); i++) {
// you try to cast List<E> to ArrayList<Integer> which results in your error
// auxiliar = (ArrayList<Integer>) myList.subList(i + 1, myList.size() - 1);
List<Integer> auxiliar = myList.subList(i + 1, myList.size());
if (auxiliar.contains(myList.get(i)) && !(duplicates.contains(myList.get(i)))) {
duplicates.add(myList.get(i));
}
}
return duplicates;
}
此外,避免使用原始类型。如果您使用ArrayList
而没有声明特定类型,例如ArrayList<Integer>
,那么您使用的是原始类型。
提示:始终建议查看文档。例如,在您的代码myList.subList(i + 1, myList.size() - 1);
中,您不必从size()
中减去1
。
public List<E> subList(int fromIndex, int toIndex)
:文件
返回此列表中位于指定的fromIndex(包括在内(和toIndex(不包括在内(之间的部分的视图。。。。
subList()
方法返回嵌套静态类ArrayList.SubList
的对象。您正试图将其强制转换为ArrayList
,尽管它们之间没有继承关系,因此ArrayList.Sublist
不能是ArrayList
。您可以使用例如List<Integer>
,因为ArrayList.SubList
实现接口subList
0。