如何在 Long 方法中 return 添加 a 和 b 的结果?

How do I return the result from the addition of a and b, in a Long method?

我正在为学校做作业,但我猜我在包装器转换方面遇到了问题。我需要 return 添加变量 a 和 b 的结果,在带有 header 的长方法中,如下所示:

public Long addIntegers(Integer a, Integer b) {
    …your code here…
} 

老实说,在这一点上我已经尝试了至少几个小时的不同事情。我在网上看了看,但我仍然很迷茫。我想我要么不理解这个问题,要么我试图以错误的方式去做。

public class Wrapper {

public Integer x;
public Integer y;

public static void main(String[] args) {
    Wrapper aWrapper = new Wrapper();
    aWrapper.addIntegers(2, 5);


}

public Long addIntegers(Integer a, Integer b) {
    Integer sum = a + b;

    return sum;
}

}

我希望它能工作,因为我认为创建和 Integer 变量将能够添加两个 int 变量,但我错了。我尝试了很多其他方法,最常见的错误是我无法将 "x" 转换为 Long。在上面的例子中,错误说它不能从 Integer 转换为 Long。

这是最简单的方法:

public Long addIntegers(Integer a, Integer b) {
    return (long)a+b; 
}

这是怎么回事?

aba+b 中隐式转换为 int。因为 a+b 的结果可能大于 int 的最大值(int=32 位,long=64 位),所以我们必须明确地将结果转换为 long。当我们 return a long 它被隐式转换为 Long 因为方法 return type.

您需要将总和转换为 long 为:

  1. (int + int) = int 转换为 long

    public Long addIntegers(Integer a, Integer b) {
        return (long) (a + b);
    }
    
  2. (int 转换为 long) + int = long

    public Long addIntegers(Integer a, Integer b) {
        return (long) a + b;
    }
    

还有:

  • 看来你不需要attributs
  • 你需要一个局部变量来保存求和的结果
class Wrapper {

    public static void main(String[] args) {
        Wrapper aWrapper = new Wrapper();
        Long res = aWrapper.addIntegers(2, 5);
    }

    public Long addIntegers(Integer a, Integer b) {
        return (long) a + b;
    }
}

由于ab属于Integer类型,因此您可以调用longValue方法来检索它们,并将它们相加并return不需要任何显式转换的 long 值。

public static Long addIntegers(Integer a, Integer b) {
    return a.longValue() + b.longValue();
}

请注意,由于我们要添加两个长值,我们还要确保它不会 运行 存在整数溢出的任何风险,因为添加两个大整数可能 运行 到其中。

试试这个例子

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

        Main main = new Main();
        System.out.println(main.addInteger(5, 5));
    }

    public Long addInteger(Integer a, Integer b) {
        Integer sum = a + b;
        return sum.longValue();
    }
}
public Long addIntegers(Integer a, Integer b) {
    Integer sum = a + b;

    return sum;
}

你几乎是对的。我明白为什么您会认为它会起作用,但是您不能隐式或通过强制转换从 Integer -> Long 开始。你需要去 Integer -> int -> long -> Long,而 Java 只能隐式跳 1 次 .

首先让我们看看a + b实际上在做什么。它将 abInteger 拆箱到原始 int,并将两者相加,得到 int。然后它会自动将其装箱到 Integer 因为那是您定义的变量 sum 的类型。

但是等一下,我们可以看到上面的 (Integer -> int -> long -> Long) Integer 实际上离我们想去的地方更远,而不是更近!

那么让我们回到 a + b,其中 returns 和 int。我们想要 Long。我们可以将结果转换为 long:

public Long addIntegers(Integer a, Integer b) {
    return (long) (a + b);
}

在这种情况下,我们有一个 int - 我们的求和表达式的结果 - 我们明确地转换为 long,并且 Java 采取最后的隐式步骤并且将其自动装箱为 Long.

然而,虽然转换在我们的案例中很好,但它通常是糟糕设计的标志,因此我尽量避免使用它。幸运的是,在我们的例子中,我们可以避免转换。我们只需要切换隐式步骤和显式步骤(即从 int -> long 隐式转换并从 long -> Long 显式转换)

public Long addIntegers(Integer a, Integer b) {
    return Long.valueOf(a + b);
}

在这个例子中,Long.valueOf接受一个原始的long和returns一个Long但是我们的a + b计算returns一个int,所以 Java 隐式地将 int 转换为 long.