我尝试用对象readExcel.readSheet(0)
列表中的数据填充tableModel,使用以下代码:
TableModel tableModel = new DefaultTableModel(
new Vector<List<Object>>(readExcel.readSheet(0)
.subList(1, readExcel.readSheet(0).size())),
new Vector<Object>(readExcel.readSheet(0).get(0)));
但是我得到了这个例外
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Vector
我认为它是关于通过列表实现Vector的,但是通过Vector的javadoc,我们可以看到它可以使用集合来实例化Vector。
我的代码段有什么问题?
答案 0 :(得分:2)
&#34;铸造&#34;是程序员到编译器的指令;它说&#34;理论上我在这里传递的类型不是所需类型的子类型,但我知道它将在运行时,所以不要给出错误说这是错误的类型。 &#34;
如果这两种类型一起存在于一个继承行中,那么编译器只能将一种类型转换为另一种类型,即它们是直接还是间接地从一种类型继承而来。
所以我猜你的有点复杂的构造函数和/或方法调用中的一个参数需要一个ArrayList,而你传递一个Vector。如果构造函数或方法需要ArrayList,则无法将Vector传递给它。
答案 1 :(得分:1)
您可以将超类强制转换为子类,反之亦然。
但Vector和ArrayList并不共享任何父子关系。
两者都有共同的祖先(List > Collection >iterable
)。
所以你可以在List中插入一个向量。但是不能直接转换为arrayList。 E.g。
public class test {
static class Foo {
}
static class Moo extends Foo {
}
/**
* @param args
*/
public static void main(String[] args) {
List<Moo> list = new ArrayList<Moo>();
for(int i=0; i<10; i++){
list.add(new Moo());
}
List<Foo> listFoo = (List<Foo>) list;
}
}
生成编译器错误,因为List不是List的子类型
所以如果你替换Vector&gt;你的代码应该可以工作使用&gt;
答案 2 :(得分:1)
我不完全确定,但我认为答案是泛型不尊重子类型。 E - 代替;克。如果B扩展A,那么你可能会认为你可以将List [B]转换为List [A],但我认为你实际上不能。虽然您可以addAll将列表中的所有项目放入列表中。
因此
List<ArrayList<Object>>
不是
的一种List<List<Object>>
并且转换失败,因为readExel的返回类型是前者而不是后者。
其原因主要与晦涩的边缘情况有关。这是有效Java中的一个项目
public class test {
static class Foo {
}
static class Moo extends Foo {
}
/**
* @param args
*/
public static void main(String[] args) {
List<Moo> list = new ArrayList<Moo>();
for(int i=0; i<10; i++){
list.add(new Moo());
}
List<Foo> listFoo = (List<Foo>) list;
}
}
生成编译器错误,因为
List<Moo>
不是
的子类型List<Foo>
因此,如果替换
,您的代码应该可以正常工作Vector<List<Object>>
带
Vector<ArrayList<Object>>