Java 重载参数为null的方法调用
可能重复:Java 重载参数为null的方法调用,java,overloading,Java,Overloading,可能重复: 在下面的代码中,输出是 串 如果我移除参数类型为String的方法,则输出为 反对 我知道当参数类型不完全匹配时,方法重载是如何起作用的,但我无法理解null如何被视为对象和/或字符串参数 对此有何解释 class C { static void m1(Object x) { System.out.print("Object"); } static void m1(String x) { System.out.print("
在下面的代码中,输出是 串 如果我移除参数类型为
String
的方法,则输出为
反对
我知道当参数类型不完全匹配时,方法重载是如何起作用的,但我无法理解null如何被视为对象和/或字符串
参数
对此有何解释
class C {
static void m1(Object x) {
System.out.print("Object");
}
static void m1(String x) {
System.out.print("String");
}
public static void main(String[] args) {
m1(null);
}
}
如果在将null
作为参数传递时需要强制调用特定的重载方法,则必须强制转换它,如下所示:
m1((String)null);
通过这样做,您可以确保调用的是正确的重载版本的方法。您必须设置null
的类型,以告诉Java您要调用什么函数
所以你可以:m1((Object)null)
使用对象调用实现
参数,您可以执行m1((字符串)null)
调用另一个。它始终使用第15.12.2.5节中规定的最具体的方法
简介对此相当具体:
如果一个方法调用可以访问并适用于多个成员方法,则有必要选择一个成员方法来为运行时方法分派提供描述符。Java编程语言使用的规则是选择最具体的方法
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法,而不会出现编译时类型错误,那么一个方法比另一个方法更具体
一般来说,至少在代码可读性方面,最好尽量明确。您可以将null
强制转换为与要调用的签名匹配的类型。但这绝对是一个值得怀疑的做法。它假设每个人都知道这条规则,并使代码更难阅读
但是这是一个很好的学术问题,所以我+1你的问题。当多个重载匹配一个签名时,Java从中选择最具体的方法
null
的值与Object
和String
匹配,但String
是Object
的子类,因此选择String
。如果在类层次结构中添加另一个同级为String
的重载,则会出现编译错误\
// DOES NOT COMPILE
class C {
static void m1(Object x) {
System.out.print("Object");
}
static void m1(String x) {
System.out.print("String");
}
static void m1(Integer x) {
System.out.print("Integer");
}
public static void main(String[] args) {
m1(null);
}
}
下面是一个详细讨论您的代码示例的示例。1。由于字符串也是一个对象,JVM
在运行时调用哪个方法时变得混乱
2.如果要指定在运行时调用哪个方法,可以通过显式强制转换来实现
例如:
m1((String)null);
但是null如何与签名匹配。它既不是字符串也不是对象。字符串或对象可以表示为null,对吗?因此,null可以表示任何一种类型,因此两个签名都匹配。但由于字符串扩展了对象,所以字符串更为具体,并且在调用不明确时优先使用该方法。这不是JVM感到困惑的原因。它总会找到最具体的方法。它之所以混淆是因为null既不是字符串也不是对象。为什么m1(整数x)
会导致编译时错误?