Java数组索引使用long变量引发Type mismatch错误的原因咨询
Java数组索引使用long变量引发Type mismatch错误的原因咨询
首先贴出你遇到问题的代码:
long A[]=new long[1000]; Scanner a=new Scanner(System.in); for(long I=0;I<A.length;I++){ A[I]=a.nextLong();//error } return true; }
我特别理解你的困惑——明明I是long类型,数组A也是存储long元素的数组,怎么就会出现type mismatch: cannot convert from long to int的错误呢?其实这里混淆了两个完全不同的概念:数组元素的类型和数组索引的类型。
问题本质
Java语言明确规定:数组的索引(也就是方括号里用来定位元素的值)必须是int类型,或者可以自动提升为int的小数值类型(比如byte、short、char),这个规则和数组中存储的元素类型没有任何关系。
你这里用了long类型的变量I作为索引,Java编译器不会自动把long转成int(因为long的取值范围远大于int,强制转换可能会丢失精度,属于不安全操作),所以直接抛出了类型不匹配的错误。
解决办法
根据你的场景,有两种实用的处理方式:
- 把循环变量改成int类型(推荐)
你的数组长度只有1000,完全在int的取值范围内(int的范围是-2147483648到2147483647),直接修改循环变量类型即可:long A[]=new long[1000]; Scanner a=new Scanner(System.in); // 把I改成int类型 for(int I=0;I<A.length;I++){ A[I]=a.nextLong(); } return true; } - 手动强转long为int(谨慎使用)
如果你的业务场景确实需要用long类型的变量(比如处理超大长度的集合,但普通数组最大长度就是int的最大值,这种情况更建议用ArrayList等集合类),可以手动把long强转为int,但要确保I的取值不会超出int的范围,否则会出现意想不到的索引错误:long A[]=new long[1000]; Scanner a=new Scanner(System.in); for(long I=0;I<A.length;I++){ // 手动强转I为int A[(int)I]=a.nextLong(); } return true; }
总结一下
记住一个核心关键点:数组元素的类型(这里是long)决定了你能往数组里存什么类型的数据;而数组索引的类型必须是int,决定了你用什么类型的值去定位数组里的元素,这两者是完全独立的要求哦。
备注:内容来源于stack exchange,提问作者Tanuj Reddy
相关产品推荐
相关产品推荐

