我在下面有一个相当简单的测试用例。我可以向构造函数发送空值而没有任何问题或错误,但是当我尝试向方法发送空值时,它会出错:error: incompatible types: <null> cannot be converted to int
(或者预期的任何类型)。我不确定为什么会发生这种情况,而且我在很多地方看到过发送空值是可以接受的做法。在所有现实中,我只需要空值,以便我可以将此示例泵入Soot和Spark进行静态分析,因此除了Spark-static分析中入口点的语义必要性之外,发送给方法的实际参数是无关紧要的。
public class Test {
public Test(Object var1, Object var2) {
//do irrelevant stuff here with var1 and var2
}
public void api1(int x, int y) {
// do irrelevant stuff with x and y
}
public List<String> api2(String x, int y, boolean a) {
// do irrelevant stuff with x, y, and a and return a new ArrayList<String>()
}
}
public class Main {
public static void main(String[] args) {
Test usingVars = new Test(1, 2); // works, compiles and no errors
Test usingNulls = new Test(null, null); // works, compiles and no errors
/**
* usingVars will obviously work and not complain at all
*/
usingVars.api1(1, 2); // works, compiles and no errors
usingVars.api2("test", 1, false); // works, compiles and no errors
/**
* usingNulls should work, but throws this error on compilation:
* error: incompatible types: <null> cannot be converted to int
*/
usingNulls.api1(null, null); // should work, doesn't compile errors out
usingNulls.api2(null, null, null); // should work, doesn't compile errors out
}
}
答案 0 :(得分:6)
原语(例如int
s)无法取null
个。如果您绝对必须使用null
值,则应将方法参数定义为相应的包装类(例如java.lang.Integer
的{{1}}):
int
答案 1 :(得分:1)
在Java中,您有两种类型的变量,基元和引用。
引用可以是null
,因为它不引用任何内容。原语(例如int
)不能是null
,它必须是数字。
如果您不关心价值观,可以使用0
,-1
或Integer.MIN_VALUE
答案 2 :(得分:1)
将new Rest().new Config();
传递给方法,构造函数或其他方式是不可能的原始类型(例如restful.new Config();
,null
,int
,short
)因为在java中你有两个类型系统,基元和对象。可以将基元强制转换为对象包装器(例如byte
,float
,Integer
,Short
)并用作对象,因此如果需要要传递null,请使用Byte
,而不是Float
。但是,java中用于传递Integer
无用值的约定是使用int
。