【问题标题】:Java converts long to intJava 将 long 转换为 int
【发布时间】:2020-11-21 12:13:45
【问题描述】:

以下代码:

 import java.util.*;

 public class HelloWorld{

 public static void main(String []args){

    Scanner s = new Scanner(System.in);
    
    long N = s.nextLong();
    long[] arr = new long[N];
    
    System.out.println(N);
    
 }
}

收到此错误:

HelloWorld.java:12: error: incompatible types: possible lossy conversion from long to int long[] arr = new long[N];

据我了解,代码中不涉及 int,谁能解释为什么会发生这种情况以及如何解决这个问题?

【问题讨论】:

  • 数组大小是使用ints 定义的,因此在... = new long[N] 中,编译器会尝试将long N 的值转换为int 值。由于此转换可能会降低精度,因此不会执行自动转换,而是会生成编译时错误。将N 定义为int 并改为阅读int,你应该很高兴。 --- 顺便说一句:java 中的变量名应始终以小写字母开头 (long N = ...; -> long n = ...;)

标签: java int long-integer


【解决方案1】:

java 中数组的最大长度是 2,147,483,647 (2^31 - 1),这是 int 的最大长度。因此,数组隐含地可以具有 int 的最大值。所以它不能接受长数字。

【讨论】:

    【解决方案2】:
    long[] arr = new long[N];
    

    在这一行中,您正在创建一个大小为 N 的数组,但 Java 中的数组大小只能是整数,这就是为什么它将 N 读取为 int 的原因,如果您的意图是创建一个大小为 N 的数组,您应该将 N 读取为诠释

    int N = s.nextInt();
    

    【讨论】:

      【解决方案3】:

      Java 中数组的大小不能超过int 的范围,因此创建数组的size 参数隐含为int。将N 更改为int。

      来自JLS 15.10.1 Array Creation Expression(强调我的):

      每个维度表达式都经过一元数字提升(第 5.6.1 节)。 提升的类型必须是int,否则会出现编译时错误。

      【讨论】:

        【解决方案4】:

        Java 中的数组下标和大小必须始终为int,因此在此表达式中new long[N] 中N 被转换为int,并且因为long 的范围比int 更宽,所以这是一个缩小范围必须明确完成的转换:new long[(int) N]。或者将N 读作int: int N = s.nextInt()。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-27
          • 1970-01-01
          • 1970-01-01
          • 2010-11-21
          • 2014-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多