重载冲突

时间:2014-06-30 04:54:44

标签: java overloading

这个问题困扰了我一段时间。请帮忙

假设有两种方法

public void add(Object obj){
/* some logic*/
}

public void add(String str){
/*Some logic*/
}

所以当我打电话给add(null)哪个方法会被执行以及为什么?

感谢

2 个答案:

答案 0 :(得分:1)

它将使用String参数调用方法...

Java中的

类是Object的直接或间接子类。所以String是Object的子类型,重载接受String的方法比重载接受Object的方法更具体。 String可以转换(upcast)到Object,但是Object不能转换(向下转换或向上转换)为String,因此采用String参数的方法更具体。因此,print(String)将调用print(String)。

答案 1 :(得分:1)

在这种情况下,String参数版本获胜,因为String是一个更具体的类型,因为每个类都是Object的子类(除了它自己)。

无论如何,您仍然可以通过强制转换调用Object参数版本。

e.g。

app.add((Object) null);

如果有多个潜在匹配,例如版本add(Integer i)版本可用,则表示错误,并且无法编译。