如果你有两个重载方法,那么:
public void methodName(File file){}
public void methodName(String string){}
如果您尝试使用methodName
拨打null
,则会收到错误消息,说明这是不明确的,这是可以理解的,因为它不知道要采用哪种方法。
我知道您可以投出null:methodName((String) null)
但是如何创建专门用于处理调用methodName(null)
的情况的方法?
这样的事情:
public void methodName(null null){}
如何创建一个必须为null的方法?
答案 0 :(得分:4)
只需制作一个没有任何参数的方法。
public void methodName(){}
要求must take a null
与需要总是需要5的方法或总是需要" foo"的方法相同的方法。如果传递的参数应该始终包含相同的值,则根本不需要该参数。
如果你要求的方法只要传递的参数为null就会被选中,无论它的类型如何(即下面的两个方法调用都会调用相同的重载方法),
File f = null;
String s = null;
methodName (f);
methodName (s);
这是不可能的,因为必须使用参数的编译时类型在编译时选择要使用的重载方法。在编译时,编译器无法在执行方法时知道传递的变量包含null。
答案 1 :(得分:2)
有一种类型通常用于表示null
,这是Void
,其唯一有效值为null
。
你可以写
void methodName(Void v);
通常用于通用返回类型,例如。
Future<Void> future = executorService.submit(new Callable<Void>() {
public Void call() throws IOException {
try(FileInputStream fis = new FileInputStream(filename)) {
doSomething(fis);
}
return null;
}
});
// later
future.get();
您可能想知道,为什么不使用Runnable
,因为我们不需要return null;
,但Runnable
不能抛出已检查的异常,所以如果我们希望捕获IOException,我们会使用Callable在future
对象中。
在Java 8中,你可以使用lambdas,但是如果抛出一个已检查的异常,编译器仍会期望返回null,因为它必须使用Callable
Future<Void> future = executorService.submit(() -> {
try(FileInputStream fis = new FileInputStream(filename)) {
doSomething(fis);
}
return null;
});
答案 2 :(得分:0)
如果是Object
,传递的参数始终始终为null 。当你尝试在空引用上运行一个方法时,你会得到一个空指针异常。
因此,public void methodName(File file){}
可以被称为methodName(null)
,没有例外。
然而,
public void methodName(File file) {
file.delete();
}
如果传递null,将导致空指针异常。
答案 3 :(得分:0)
您无法编写专门用null
的方法。你必须做这样的事情:
methodName(File file) {
if(file == null) {
someOtherMethod();
}
else {
// other stuff
}
}
但是,只有methodName(File)
句柄null
更为常见,并记录它对null
的作用。如果你有另外一种方法,methodName(File)
和someOtherMethod()
都不是最终方法,你应该记录内部电话。
答案 4 :(得分:0)
你不能这样做。请记住,您可能隐含null
。例如:
File file = null;
methodName(file);
但是,Java编译器必须将调用链接到特定方法签名,因此它应该在编译时知道null
是否已通过。
另一方面,为什么坚持null
?没有什么能阻止您定义特殊类型:
enum Null { NULL }
public void methodName(File file){}
public void methodName(String string){}
public void methodName(Null n) {}
methodName(Null.NULL); // or methodName(NULL); with import static
答案 5 :(得分:-1)
正如您所见,编译器无法解析在传递Array(
[0] => Array
(
[name] => View
[key] => view
[val] => 0
)
[1] => Array
(
[name] => Add
[key] => add
[val] => 0
)
)
时采用不同类型对象的两种方法。
解决这个问题的唯一方法是使用类型转换,就像你已经完成的那样,或者采用一种采用通用null
类型并尝试向下转换的方法:
Object
编写看起来像这样的代码往往被视为臭,并且有充分的理由。它很快变得复杂,难以维护等等。最好的办法是进行类型转换或更改方法签名,以便您(和编译器)始终知道应该调用哪个函数来处理特定的public void methodName( Object object ) {
if ( object == null ) {
// do something with null
} else if ( object instanceof File ) {
// do something with ((File)object)
} else {
// do something else
}
}
对象。