为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕勒3428872 2023-07-28 16:05:14
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);}
查看完整描述

2 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

Java 编译器没有检查您添加到列表中的元素的类型,因为您声明了原始类型:

List list = new ArrayList();

然后在执行期间您尝试分配Stringint,这ClassCastException在运行时引起。

您在这一行没有遇到异常int int0 = list.get(0);,因为自动装箱(在本例中为拆箱)。

正是这类问题导致了Java 语言中引入泛型。因此,为了让编译器检查放入列表的类型,您需要将声明更改为:

List<Integer> list = new ArrayList<>();

这将告诉编译器检查添加到列表中的值的类型并强制它们为Integers。因此,基本上运行时错误将被消除并被编译时错误取代。



查看完整回答
反对 回复 2023-07-28
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

像这样的类型化定义List<Integer>正是为了防止此类错误。但是您没有使用List list任何类型,因此您拒绝在运行程序之前获取有关编译期间错误的信息。

声明具有特定类型的列表

List<Integher> list = new ArrayList<>();

...Java编译器会告诉你你的错误。您将看到以下行被标记为错误:

list.add("2");


查看完整回答
反对 回复 2023-07-28
  • 2 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信