可能是一个愚蠢的问题,但我怎样才能将null
传递给采用long
或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
思考,建议?
答案 0 :(得分:39)
问题在于int
和long
是原语。您无法将null
传递给原始值。
您当然可以在方法签名中使用包装类Integer
和Long
而不是long
和int
。
答案 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))