如何修复:java.lang.ClassCastException:java.util.ArrayList无法转换为java.lang.Integer

3
当我尝试运行以下代码时,遇到了一个问题:
ArrayList paretoSet=new ArrayList();   // contains a collection of ArrayList
ArrayList<Integer> toPass=new ArrayList<Integer>();
int[] fParetoSet=new int[ParetoSet.size()];
int[] gParetoSet=new int[ParetoSet.size()];

for (int i=0;i<paretoSet.size();i++){
        toPass.clear();
        toPass.add((Integer)paretoSet.get(i));
        int [] totake=calculate(toPass);
        fParetoSet[i]=totake[0];
        gParetoSet[i]=totake[1];       
    }

`claculate(ArrayList x)`是一个方法,它接受一个整数数组列表并返回一个整数数组。我不能将Paretoset设置为整数数组列表,因为这会在程序的其他部分中创建问题。我在以下代码行中遇到了异常:toPass.add((Integer)paretoSet.get(i));
错误提示为java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Integer。我该如何解决这个问题?
提前感谢。


2
另外,请使用Java编码规范。PareToSet应该以小写字母开头;一开始我还以为你在调用静态方法。 - markspace
你还没有展示给我们ParetoSet中包含了什么。我猜它是ArrayList,但请展示给我们以确认。 - Sotirios Delimanolis
那么ParetoSet的类型是ArrayList<ArrayList<Integer>>,对吗? - Steve McKay
((Integer)ParetoSet.get(i)),你将一个ArrayList强制转换为int类型。toPass.add(ParetoSet.get(i))可能是你想要的。 - criszhao
你确定你遇到了错误吗?因为我刚刚复制粘贴并运行了你的代码。它没有任何问题。还有一件事,你不需要将ParetoSet.size()强制转换为Integer。 - Thusitha Thilina Dayaratne
我同意 paretoSet 应该是一个小写的变量。我已经进行了改进。paretoSet 是代码中提到的一组 ArrayList 集合。例如:
paretoset=[[1,2,3], [2,3,4], [2,6,3]]
- Neha
2个回答

2
如果ParetoSet是一个ArrayList集合,那么调用ParetoSet.get(i)将会返回索引为iArrayList。正如错误所述,ArrayList不是Integer类型,也不能被转换为它。
其他注意事项:
  • 您的变量应该使用驼峰命名法:pareToSet
  • 自动装箱意味着JDK5以后的版本中,for循环中的强制类型转换是不必要的
  • Paretoset已经声明为原始类型
  • JDK7以后的版本中,类型推断使得new ArrayList<Integer>()是多余的

编辑

  • 根据Jim的评论,您的变量应该使用驼峰命名法:paretoSet

编辑

ArrayList既不在概念上,也不在实际上是一个Integer。如果您说“列表是整数类型”,这是不合理的。如果我们查看ArrayListjavadoc,我们可以看到它的继承树是:

java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractList<E>
java.util.ArrayList<E>

All Implemented Interfaces:
Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess

因此,我们可以说例如ArrayListAbstractListAbstractCollection的一种类型,但不是Integer,因为Integer不是它的血统的一部分。


是的,你理解得没错,但这正是我的程序所需要的。我需要将一个整数类型的ArrayList传递给calculate()方法,但我不能将paretoSet设置为整数类型的ArrayList,因为它会在程序的其他方法中出现问题。有没有其他方法可以做到这一点? - Neha
你没有理解问题所在,toPass 是一个 ArrayList 类型的 Integer,可以传递到你的 calculate() 方法中。你的问题在于你已经声明 toPass 只能接受 Integer,然后你又试图将一个 ArrayList 添加到其中。 - Romski
如果这个回答解决了你的问题,请接受它。 - Romski
请注意,我尝试将*(Integer)paretoSet.get(i)添加到toPass中,这就是问题出现的地方。我试图将paretoSet中索引为i的数组列表强制转换为整数类型,然后将其添加到toPass*中,但是这种强制转换是不允许的!!!我的问题仍然存在。 - Neha

0
你的程序在下面的代码行中存在类型转换问题。 你试图将列表数组的类型转换添加到整数数组列表中。这是错误的。如果你想要将ArrayList对象添加到其他ArrayList中,请使用泛型作为object。
ArrayList ParetoSet=new ArrayList();   // contains a collection of ArrayList
toPass.add((Integer)ParetoSet.get(i));

应该像下面这样:

ArrayList<ArrayList> ParetoSet=new ArrayList<ArrayList>();  
ArrayList<ArrayList> toPass=new ArrayList<ArrayList>();  
toPass.add(ParetoSet.get(i));

那么你应该更改代码位以适应你进一步的逻辑


请将您尝试实现的完整代码作为示例程序放置,我可以尝试找到真正的问题。 - Will Mcavoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接