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();
然后在执行期间您尝试分配String
给int
,这ClassCastException
在运行时引起。
您在这一行没有遇到异常int int0 = list.get(0);
,因为自动装箱(在本例中为拆箱)。
正是这类问题导致了Java 语言中引入泛型。因此,为了让编译器检查放入列表的类型,您需要将声明更改为:
List<Integer> list = new ArrayList<>();
这将告诉编译器检查添加到列表中的值的类型并强制它们为Integer
s。因此,基本上运行时错误将被消除并被编译时错误取代。
收到一只叮咚
TA贡献1821条经验 获得超4个赞
像这样的类型化定义List<Integer>
正是为了防止此类错误。但是您没有使用List list
任何类型,因此您拒绝在运行程序之前获取有关编译期间错误的信息。
声明具有特定类型的列表
List<Integher> list = new ArrayList<>();
...Java编译器会告诉你你的错误。您将看到以下行被标记为错误:
list.add("2");
添加回答
举报
0/150
提交
取消