【问题标题】:Can i type cast a long type 1d array element into int?我可以将 long 类型的一维数组元素类型转换为 int 吗?
【发布时间】:2019-05-21 19:03:18
【问题描述】:
class Test {
    public static void main(String[] args) {
        long[] longarr = {40, 50, 70, 90};
        int sum = 0;
        for (int x: (int) longarr) {
            sum += x;
        }
        System.out.println("sum is " + sum);
    }
}

我们如何在不将 long 类型数组设置为 int 的情况下修复错误。有什么办法吗?

【问题讨论】:

  • 在这种情况下,这很明显,但是当您要求修复错误时,最好复制错误的文本。
  • 它们是 long 元素是有原因的,在实际转换之前考虑向下转换以及它对数据的作用。
  • 请注意,将longs 的总和转换为int 是完全不安全的。我希望对那些longs 有一些限制,以防止总和超过int 的最大值。

标签: java arrays foreach int long-integer


【解决方案1】:

您的代码有几个问题:

  1. 您不能像这样将long[] 转换为int[] --> (int) longarr,所以您需要将其保留为for (int x: longarr) {...}
  2. 如果您已将其更改为for (int x: longarr) {...},则会出现一个新错误,因为编译器无法将long 显式转换为int,因此您可以将变量的类型更改为for (long x: longarr) {...}
  3. 现在您可以在应用求和之前将每个 long 转换为 int

@Meini 的方法就是这样做的,但无论如何这里还有另一种方法:

int summation = Arrays.stream(longarr).mapToInt(v -> (int)v).sum();

请注意,此处需要mapToInt 才能实际获得所需的int 值,否则如果我们将longs 的总和直接分配给int 变量,编译器将报错为long可以存储比int 大得多的值。

另一个版本:

int summation = (int)Arrays.stream(longarr).sum();

【讨论】:

  • 好答案+1。您可能想解释mapToInt 步骤以及为什么可以避免有损转换错误。
  • @TimBiegeleisen 更新了更多信息,希望对您有所帮助。感谢您的反馈。
【解决方案2】:

试试

public static void main(String[] args) {
    long[] longarr = {40, 50, 70, 90};
    int sum = 0;

    for (long x : longarr) {
        sum += (int)  x;
    }
    System.out.println("sum is " + sum);
}

实际上你不必将x 显式转换为int -> sum += x;,我把它留在那里让它更清楚

【讨论】:

  • @MuratKaragöz 你不能像int[] s = new long[0] 这样将原始数组转换为另一个数组,在这种情况下更糟,因为long[] 被转换为int。虽然你可以投Object[] str = new String[0];
【解决方案3】:

您的问题一定是:

如何修复错误:不兼容的类型:long 无法转换 诠释

在循环中改为:

 public class NewClass {  
      public static void main(String[] args) {

            long[] longarr = {40, 50, 70, 90};
            int sum = 0 ; 

            for (long  x: longarr  ) { // don't need cast 
                sum += x;
            }
            System.out.println("sum is " + sum);
        }
         }

运行:

 sum is 250

【讨论】:

  • 欢迎来到 StackOverflow MyPs,这是您的第一个答案!
【解决方案4】:

正确:

for (long x : longarr) {

}

无需进行显式类型转换。

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多