如何将null传递给期望long或int的方法?

时间:2012-04-30 18:56:55

标签: java

可能是一个愚蠢的问题,但我怎样才能将null传递给采用longint的方法?

示例:

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

思考,建议?

7 个答案:

答案 0 :(得分:39)

问题在于intlong是原语。您无法将null传递给原始值。

您当然可以在方法签名中使用包装类IntegerLong而不是longint

答案 1 :(得分:12)

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

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

现在,您可以将空引用传递给包装类型的实例。 Autoboxing允许你写:

iTakeInt(5);

在该方法中,您可以写:

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

或使用自动拆箱:

if (id != null) {
    doSomethingWith(id); // Equivalent to the code above
}

答案 2 :(得分:5)

您可以将null转换为非原始包装类,它将进行编译。

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

但是,这会在执行时抛出NullPointerException。没什么帮助,但知道你可以传递相当于一个以原语作为参数的方法的包装器是很有用的。

答案 3 :(得分:4)

根据您拥有的此类方法数量以及通话次数,您可以选择其他方式。

您可以编写包装器方法(N.B。,而不是类型包装器(int => Integer),而不是在您的代码库中分配空检查,而不是包装你的方法):

public void iTakeLong(Long val) {
    if (val == null) { 
        // Do whatever is appropriate here... throwing an exception would work
    } else {
        iTakeLong(val.longValue());
    }
}

答案 4 :(得分:3)

使用Wrapper类:

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

答案 5 :(得分:2)

你做不到。 Java中的原始类型不能是null

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

public void iTakeLong(Long id);
public void iTakeInt(Integer id);

答案 6 :(得分:1)

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

testClass.iTakeLong((Long)null)

一种解决方案是使用类型Long而不是原始long

public void iTakeLong(Long param) { }

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

testClass.iTakeLong(NumberUtils.toLong(null))