java中null的使用方法,在Java中重载方法中使用null

The following code compiles and goes fine.

public class Main

{

public void temp(Object o)

{

System.out.println("The method with the receiving parameter of type Object has been invoked.");

}

public void temp(String s)

{

System.out.println("The method with the receiving parameter of type String has been invoked.");

}

public void temp(int i)

{

System.out.println("The method with the receiving parameter of type int has been invoked.");

}

public static void main(String[] args)

{

Main main=new Main();

main.temp(null);

}

}

In this code, the method to be invoked is the one that accepts the parameter of type String

The docs say.

If more than one member method is both accessible and applicable to a

method invocation, it is necessary to choose one to provide the

descriptor for the run-time method dispatch. The Java programming

language uses the rule that the most specific method is chosen.

but I don't understand when one of the methods in the code that accepts the parameter of the primitive int is modified to accept the parameter of the wrapper type Integer such as,

public void temp(Integer i)

{

System.out.println("The method with the receiving parameter of type Integer has been invoked.");

}

a compile-time error is issued.

reference to temp is ambiguous, both method temp(java.lang.String) in

methodoverloadingpkg.Main and method temp(java.lang.Integer) in

methodoverloadingpkg.Main match

In this particular scenario, why is it legal to overload a method with a primitive data type which however doesn't appear to be the case with its corresponding wrapper type?

解决方案

If you were asked what is more specialized "String" or "Object", what would you say? Evidently "String", right?

If you were asked: what is more specialized "String" or "Integer"? There is no answer, they are both orthogonal specializations of an object, how can you choose between them? Then you must be explicit regarding which one you want. For instance by casting your null reference:

question.method((String)null)

When you use primitive types you do not have that problem because "null" is a reference type and cannot conflict with primitive types. But when you use reference types "null" could refer to either String or Integer (since null can be cast to any reference type).

See the answer in the other question that I posted in the comments above for further and deeper details and even a few quotes from the JLS.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值