java.util.ArrayList无法强制转换为java.util.Vector

时间:2014-06-03 10:58:04

标签: java casting jtable tablemodel

我尝试用对象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。

我的代码段有什么问题?

3 个答案:

答案 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>>