【问题标题】:OverLoading : Ambigutiy while the parameters are primitive but not while it is Reference typeOverLoading : 当参数是原始的但不是当它是引用类型时模棱两可
【发布时间】:2016-09-19 03:54:23
【问题描述】:
public class Test {

public static void main(String[] args) throws ClassNotFoundException {


    new Test().f("dfffg");   // it is running perfectly
    new Test().f(1, 1);      // it is giving ambiguity
}

public void f(int a,long b){
    System.out.println("in int and long");
}

public void f(long a,int b){
    System.out.println("in long and int");
}

public void f(String s) {
    System.out.println("in String");

}


public void f(StringBuffer o) {
    System.out.println("in String bufer");

}

public void f(Object o){
    System.out.println("in object");
}
}

当我执行此new Test().f("dfffg"); 时,它运行良好,尽管我们有 StringBuffer 和 Object 作为参数的重载方法

虽然 f(1,1) 给出了歧义,但我可以理解。

【问题讨论】:

  • 如果没有找到匹配的数据类型,int 可以提升为 long。这会导致功能模糊。如果你想同时使用这两个函数,你可以使用 f(int... a) 和 f(long... a) 之类的函数。这些不是您的问题的解决方案,但可以帮助解决歧义。

标签: java string object stringbuffer


【解决方案1】:

new Test().f("dfffg") 匹配public void f(String s)public void f(Object o) 的签名。当您传递对象参数时,将选择具有最具体参数类型的方法:在本例中为 public void f(String s)StringObject 更具体,因为 StringObject 的子类。

public void f(StringBuffer o) 在此示例中不相关,因为StringBuffer 不是String 的超类,因此您不能将String 传递给需要StringBuffer 的方法。

【讨论】:

  • @sparsh610 我刚刚编辑了答案以解决这个问题。
猜你喜欢
  • 2018-08-20
  • 1970-01-01
  • 2011-09-07
  • 2020-05-11
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多