我添加了三个带参数的方法:
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
方法?
7条答案
按热度按时间xqkwcwgp1#
我试过这个方法,当有一对重载方法,其中一个有一个参数类型对象时,编译器总是选择更具体类型的方法。但是当有多个特定类型时,编译器抛出一个不明确的方法错误。
因为这是一个编译时事件,所以只有当有人故意将null传递给这个方法时,才会发生这种情况。如果有意这样做,那么最好不带参数再次重载此方法,或者创建另一个方法。
mitkmikd2#
当使用
null
争论。因为每个参数类型都是引用类型。下面是用null调用一个特定方法的三种方法。
如果你真的打算用
null
论据。这样的设计将来会出错。vmdwslir3#
java中的每个类都扩展对象类,甚至整数类也扩展对象类。因此,对象和整数都被视为对象示例。因此,当您将null作为参数传递时,编译器会混淆要调用哪个对象方法,即使用parameter object或parameter integer,因为它们都是对象,并且它们的引用可以为null。但是java中的原语并不扩展object。
omtl5h9j4#
null
是三种类型中任何一种的有效值;因此编译器无法决定使用哪个函数。使用类似doSomething((Object)null)
或者doSomething((Integer)null)
相反。9nvpjoqh5#
由于dosomething(char[]obj)和dosomething(integer obj),存在歧义。
char[]和integer对于null都是相同的优势,这就是为什么它们是不明确的。
eanckbw96#
java总是尝试使用可用方法的最具体的适用版本(参见jls)§15.12.2).
Object
,char[]
以及Integer
都能接受吗null
作为有效值。因此这3个版本都是适用的,所以java必须找到最具体的版本。自
Object
是超级类型的char[]
,数组版本比Object
-版本。因此,如果只有这两种方法存在,那么char[]
将选择版本。当两个
char[]
以及Integer
如果有可用的版本,那么这两个版本都比Object
但是没有一个比另一个更具体,所以java无法决定调用哪一个。在这种情况下,您必须通过将参数强制转换为适当的类型来显式地提到要调用哪个参数。请注意,在实践中,这个问题的发生比人们想象的要少得多。这样做的原因是,只有在使用显式调用方法时才会发生这种情况
null
或者使用非特定类型的变量(例如Object
).相反,以下调用将是完全明确的:
尽管你还在传递值
null
,java确切地知道要调用哪个方法,因为它会考虑变量的类型。ggazkfy87#
输出为int,称为null,因此使用char[]和integer表示歧义