Java 空参数的方法重载

Java 空参数的方法重载,java,oop,null,overloading,Java,Oop,Null,Overloading,我添加了三种带参数的方法: public static void doSomething(Object obj) { System.out.println("Object called"); } public static void doSomething(char[] obj) { System.out.println("Array called"); } public static void doSomething(Integer obj) { System

我添加了三种带参数的方法:

public static  void doSomething(Object obj) {
    System.out.println("Object called");
}

public static  void doSomething(char[] obj) {
    System.out.println("Array called");
}

public static  void doSomething(Integer obj) {
    System.out.println("Integer called");
}

当我调用
doSomething(null)
时,编译器抛出的错误是不明确的方法。问题也是如此,因为
Integer
char[]
方法或
Integer
Object
方法?

null
是这三种类型中任何一种的有效值;因此编译器无法决定使用哪个函数。使用类似于
doSomething((Object)null)
doSomething((Integer)null)
的内容来代替。

null
是三种类型中任何一种的有效值;因此编译器无法决定使用哪个函数。请改用
doSomething((Object)null)
doSomething((Integer)null)
之类的方法。

当使用
null
参数调用时,这三个方法中的每一对本身都是不明确的。因为每个参数类型都是引用类型

以下是使用null调用您的一个特定方法的三种方法

doSomething( (Object) null);
doSomething( (Integer) null);
doSomething( (char[]) null);

如果您实际计划使用
null
参数调用这些方法,我建议您消除这种歧义。这样的设计会在将来引发错误。

当使用
null
参数调用时,这三种方法中的每一对本身都是不明确的。因为每个参数类型都是引用类型

以下是使用null调用您的一个特定方法的三种方法

doSomething( (Object) null);
doSomething( (Integer) null);
doSomething( (char[]) null);

如果您实际计划使用
null
参数调用这些方法,我建议您消除这种歧义。这样的设计将来会带来错误。

Java中的每个类都扩展了对象类。即使是整数类也扩展了对象类。因此,对象和整数都被视为对象实例。所以,当您将null作为参数传递时,编译器会混淆调用哪个对象方法,即使用parameter object或parameter Integer,因为它们都是对象,并且它们的引用可以为null。但是java中的原语并不扩展Object。

java中的每个类都扩展Object类。即使是Integer类也扩展Object。因此,对象和整数都被视为对象实例。所以,当您将null作为参数传递时,编译器会混淆调用哪个对象方法,即使用parameter object或parameter Integer,因为它们都是对象,并且它们的引用可以为null。但是java中的原语并不扩展对象。

java总是尝试使用可用方法的最具体适用版本(请参阅)

Object
char[]
Integer
都可以将
null
作为有效值。因此,所有3个版本都适用,因此Java必须找到最具体的版本

由于
对象
char[]
的超级类型,因此数组版本比
对象
-版本更具体。因此,如果只有这两种方法存在,将选择
char[]
版本

char[]
Integer
版本都可用时,它们都比
Object
更具体,但没有一个比另一个更具体,因此Java无法决定调用哪一个。在这种情况下,您必须通过将参数强制转换为适当的类型来明确说明要调用哪个参数

请注意,在实践中,这个问题的发生比人们想象的要少得多。原因是,只有在使用
null
或非特定类型的变量(例如
Object
)显式调用方法时,才会发生这种情况

相反,以下调用将是完全明确的:

char[] x = null;
doSomething(x);

尽管您仍在传递值
null
,但Java确切地知道要调用哪个方法,因为它会考虑变量的类型。

Java将始终尝试使用可用方法的最具体适用版本(请参阅)

Object
char[]
Integer
都可以将
null
作为有效值。因此,所有3个版本都适用,因此Java必须找到最具体的版本

由于
对象
char[]
的超级类型,因此数组版本比
对象
-版本更具体。因此,如果只有这两种方法存在,将选择
char[]
版本

char[]
Integer
版本都可用时,它们都比
Object
更具体,但没有一个比另一个更具体,因此Java无法决定调用哪一个。在这种情况下,您必须通过将参数强制转换为适当的类型来明确说明要调用哪个参数

请注意,在实践中,这个问题的发生比人们想象的要少得多。原因是,只有在使用
null
或非特定类型的变量(例如
Object
)显式调用方法时,才会发生这种情况

相反,以下调用将是完全明确的:

char[] x = null;
doSomething(x);

尽管仍在传递值
null
,但Java确切地知道要调用哪个方法,因为它会考虑变量的类型。

我已经尝试过了,当有一对重载方法,其中一个具有参数类型对象时,编译器将始终选择具有更具体类型的方法。但当存在多个特定类型时,编译器会抛出一个不明确的方法错误


由于这是一个编译时事件,因此只有在有意将null传递给此方法时,才会发生这种情况。如果这是有意的,那么最好不带参数再次重载此方法,或者创建另一个方法

我已经试过了,当有一对重载方法,其中一个有参数时