java中cast arraylist和cast array的区别

java中cast arraylist和cast array的区别,java,arrays,arraylist,casting,Java,Arrays,Arraylist,Casting,正如Jon对此的回答所说,如果编译器允许这种转换(如下所示),那么以后添加一些其他对象对程序来说可能是一件坏事 ArrayList<String> temList = new ArrayList<String>(); ArrayList<Object> obList = (ArrayList<Object>)temList;//compile error //obList.add(1); --bad 那么,有人能解释一下这

正如Jon对此的回答所说,如果编译器允许这种转换(如下所示),那么以后添加一些其他对象对程序来说可能是一件坏事

    ArrayList<String> temList = new ArrayList<String>();
    ArrayList<Object> obList = (ArrayList<Object>)temList;//compile error
    //obList.add(1); --bad
那么,有人能解释一下这里的区别是什么,以及为什么java会做出这样的设计吗?谢谢


编辑:一个类似的数组不是100%的对象,它们是普通对象。但是
ArrayList
100%的对象

如果尝试为临时数组分配一个整数,它将抛出一个

所以铸造阵列是好的

但是将
ArrayList
强制转换为一个超级对象,在这个超级对象中,底层ArrayList实现只能保存一个字符串(子类),这将在运行时引起问题

多亏了泛型,编译器可以在它发生之前识别它,并且可以显示编译器错误。这是一个很好的设计,如果不是这样的话,程序将在运行时失败

在Java1.5泛型之前

List list = new ArrayList();
list.add(1);
list.add("One");
list.add(100l);

如果是合法的,编码人员必须进行大量的
实例检查。他们无法检查程序在运行时崩溃的地方

如果阵列的组件类型可分配给指定阵列的组件类型,则阵列设计为允许协变分配。类型检查是由JVM在运行时完成的,如果试图将值存储在不兼容的数组中,则会抛出。正确使用后,可以表示数组的协变类型,这通常很方便


然而,这种语言特性可能导致扩散运行时异常,Sun不希望对Java 5引入的泛型类型分配重复这种情况。相反,Sun希望在编译时发现这种无效的使用。这似乎特别重要,因为泛型引入了比数组类型更复杂的类型系统组件,这样,如果Sun做出不同的决定,类似于
ArrayStoreException
的运行时错误肯定会变得更常见。相反,对于泛型,协变和逆变的问题是通过通配符解决的,通配符允许在编译时而不是运行时发现类型错误

半无关的问题,为什么人们认为Javascript在数组中存储不同类型对象的能力是积极的?它基本上在Java中作为一个对象[],只是没有强制转换。“我相信这是一个编码的危险。”沙津抱歉,但是这个普通的对象是什么意思?有什么例子或参考资料吗?以及为什么数组不会使这种类型的强制转换成为编译器错误。谢谢。@Tony这意味着它不是一个100%的对象,因为它没有任何函数,但它有一个类似“长度”的字段。它不仅仅是一个前置变量,而不是一个完全成熟的对象。@shazin嗯,数组扩展了
对象
。因此,它们是“成熟的对象”。毫无疑问。@user3580294谢谢您的提醒
List list = new ArrayList();
list.add(1);
list.add("One");
list.add(100l);