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<>();
这将告诉编译器检查添加到列表中的值的类型并强制它们为Integers。因此,基本上运行时错误将被消除并被编译时错误取代。
 
                    
                    
                            收到一只叮咚
                            
                                
                            
                        
                        
                                                
                    TA贡献1821条经验 获得超5个赞
像这样的类型化定义List<Integer>正是为了防止此类错误。但是您没有使用List list任何类型,因此您拒绝在运行程序之前获取有关编译期间错误的信息。
声明具有特定类型的列表
List<Integher> list = new ArrayList<>();
...Java编译器会告诉你你的错误。您将看到以下行被标记为错误:
list.add("2");添加回答
举报
0/150
	提交
		取消
	