为什么 java 编译器在获取列表参数之前不检查对象类型?

Java 编译器似乎并不关心列表中的类型是否匹配,直到需要获取对象为止:


private static void print(List<Integer> list) { //private static <T> void print(List<T> list) { will also do

    for (Object object: list)

        System.out.print(object);

    int int0 = list.get(0); //ok

    //int int1 = list.get(1); //ClassCastException if run

}


public static void main(String[] args) {

    List list = new ArrayList();

    list.add(1);

    list.add("2");

    print(list);

}


慕勒3428872
浏览 108回答 2
2回答

沧海一幻觉

Java 编译器没有检查您添加到列表中的元素的类型,因为您声明了原始类型:List list = new ArrayList();然后在执行期间您尝试分配String给int,这ClassCastException在运行时引起。您在这一行没有遇到异常int int0 = list.get(0);,因为自动装箱(在本例中为拆箱)。正是这类问题导致了Java 语言中引入泛型。因此,为了让编译器检查放入列表的类型,您需要将声明更改为:List<Integer> list = new ArrayList<>();这将告诉编译器检查添加到列表中的值的类型并强制它们为Integers。因此,基本上运行时错误将被消除并被编译时错误取代。

收到一只叮咚

像这样的类型化定义List<Integer>正是为了防止此类错误。但是您没有使用List list任何类型,因此您拒绝在运行程序之前获取有关编译期间错误的信息。声明具有特定类型的列表List<Integher>&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList<>();...Java编译器会告诉你你的错误。您将看到以下行被标记为错误:list.add("2");
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java