java 方法重载 没有参数,方法重载null参数

问题

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

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)时,编译器抛出错误as模糊方法.因此问题是因为Integer和char[]方法还是Integer和Object方法?

#1 热门回答(178 赞)

Java将始终尝试使用可用方法的最具体适用版本(参见JLS §15.12.2)。

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

由于Object是超级型号char[],因此阵列版本比Object版本更具体。因此,如果仅存在这两种方法,则将选择char[]版本。

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

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

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

char[] x = null;

doSomething(x);

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

#2 热门回答(36 赞)

当用anull参数调用时,这三种方法中的每一对本身都是模糊的。因为每个参数类型都是引用类型。

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

doSomething( (Object) null);

doSomething( (Integer) null);

doSomething( (char[]) null);

如果你真的计划使用null参数调用这些方法,我建议你删除这种歧义。这样的设计将来会产生错误。

#3 热门回答(4 赞)

null是三种类型中任何一种的有效值;所以编译器无法决定使用哪个函数。使用像doSomething((Object)null)或doSomething((Integer)null)这样的东西。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值