接收Java错误-无法将ArrayList$SubList强制转换为类



我在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实现接口subList0。

最新更新