我一直在尝试访问数组列表中保存的几个数组的元素。我能够定期访问它,但问题出现在我使用泛型类型E来考虑不同的数据类型。这给了我一个类强制转换异常。如果我将tempStart和tempScan的类型以及相应的强制转换更改为int [](因为这是我用来传入的),它会运行。
public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list) {
if (list.get(0).getClass().isArray()) {
System.out.println(" I am an array!");
//go through the arrays and make sure they are
//not the same, remove any that are the same
//make flag to see if something is different
boolean matching;
for (int idx = 0; idx < list.size() - 1; idx++) {
E[] tempStart =(E[])list.get(idx);
for (int k = idx + 1; k < list.size(); k++) {
matching = true;
E[] tempScan = (E[])list.get(k);
for (int index = 0; index < tempStart.length; index++) {
if (tempStart[index] != tempScan[index]) {
matching = false;
}
}
if (matching) {
list.remove(tempScan);
k--;
}
}
}
答案 0 :(得分:4)
您正在尝试将E
投放到E[]
,但这显然不正确。尝试类似:
import java.lang.reflect.Array
...
public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list) {
ArrayList<E> retList = new ArrayList<>(list.size());
if (list.isEmpty()) return retList;
if (list.get(0).getClass().isArray()) {
boolean matching;
for (int idx = 0; idx < list.size() - 1; ++idx) {
E tempStart = list.get(idx);
for (int k = idx + 1; k < list.size(); k++) {
matching = true;
E tempScan = list.get(k);
int tempStartLen = Array.getLength(tempStart);
for (int index = 0; index < tempStartLen; index++) {
if (Array.get(tempScan, index) != Array.get(tempStart, index)) {
matching = false;
}
}
if (matching) {
list.remove(tempScan);
k--;
}
}
}
return retList;
} else {
throw new IllegalArgumentException("List element type expected to be an array");
}
}
但是因为我们使用Java Reflection Array来操作数组操作,所以使用泛型E
在这里没有意义。您可以简单地将其声明为ArrayList<Object>
更新:如下面的@afsantos评论,参数类型ArrayList
可以声明为ArrayList<?>
,因为不会插入任何内容。