28

可能是愚蠢的问题,但我怎样才能传递null给采用longor的方法int

例子:

TestClass{
  public void iTakeLong(long id);
  public void iTakeInt(int id);
}

现在我如何将 null 传递给这两种方法:

TestClass testClass = new TestClass();
testClass.iTakeLong(null); // Compilation error : expected long, got null
testClass.iTakeInt(null);   // Compilation error : expected int, got null

想法、建议?

4

7 回答 7

51

问题是int并且long是原语。您不能传递null给原始值。

您当然可以在您的方法签名中使用包装类IntegerLong代替。longint

于 2012-04-30T18:58:10.967 回答
12

你不能——没有这样的价值。如果您可以更改方法签名,则可以改为采用引用类型。Java 为每个原始类提供了一个不可变的“包装器”类:

class TestClass {
  public void iTakeLong(Long id);
  public void iTakeInt(Integer id);
}

现在您可以传递空引用对包装器类型实例的引用。自动装箱将允许您编写:

iTakeInt(5);

在该方法中,您可以编写:

if (id != null) {
    doSomethingWith(id.intValue());
}

或使用自动拆箱:

if (id != null) {
    doSomethingWith(id); // Equivalent to the code above
}
于 2012-04-30T18:58:32.390 回答
7

您可以将 null 强制转换为将编译的非原始包装类。

TestClass testClass = new TestClass();
testClass.iTakeLong( (Long)null); // Compiles
testClass.iTakeInt( (Integer)null);   // Compiles

NullPointerException但是,这会在执行时抛出一个。帮助不大,但知道您可以将包装器等效于将原语作为参数的方法传递是很有用的。

于 2012-04-30T19:09:02.913 回答
5

根据您有多少这样的方法,以及多少次调用,您还有另一种选择。

您可以编写包装器方法(注意,不是类型包装器(int => Integer),而是包装您的方法),而不是在整个代码库中分发空检查:

public void iTakeLong(Long val) {
    if (val == null) { 
        // Do whatever is appropriate here... throwing an exception would work
    } else {
        iTakeLong(val.longValue());
    }
}
于 2012-04-30T19:35:44.553 回答
3

使用包装类:

 TestClass{
    public void iTakeLong(Long id);
    public void iTakeInt(Integer id);
    public void iTakeLong(long id);
    public void iTakeInt(int id);
 }
于 2012-04-30T18:58:56.050 回答
2

你不能这样做。原始类型不能null在 Java 中。

如果要通过null,则必须将方法签名更改为

public void iTakeLong(Long id);
public void iTakeInt(Integer id);
于 2012-04-30T18:58:15.023 回答
1

将值类型转换Long为如下所示将使编译错误消失,但最终会以NullPointerException.

testClass.iTakeLong((Long)null)

一种解决方案是使用 typeLong而不是 original long

public void iTakeLong(Long param) { }

其他解决方案是使用org.apache.commons.lang3.math.NumberUtils

testClass.iTakeLong(NumberUtils.toLong(null))
于 2017-04-10T17:02:08.637 回答