【问题标题】:Method overloading and passing null [duplicate]方法重载和传递 null [重复]
【发布时间】:2014-12-02 14:12:59
【问题描述】:

我在一个类中重载了以下 2 个方法:

public class Test{

  public static void main(String []args) throws ParseException{
       Test t = new Test();
      t.testMethod(null);
  }

  public void testMethod(Object o){
    System.out.println("Object");
  }

  public void testMethod(String s){
    System.out.println("String");
  }
}

当我调用 testMethod 方法时,它会打印“String”。

当我再添加一个重载方法时:

public void testMethod(StringBuilder sb){
    System.out.println("String");
}

它抛出编译器错误:The method testMethod is ambigous for type Test..

当我使用 null 调用该方法时,这一切都会发生

我的问题是:

  1. 为什么它打印字符串而不是对象?
  2. 为什么添加第三种方法会出现编译错误?

【问题讨论】:

  • 除了您的具体问题外,我建议您避免使用 Object parm 的一个签名和具有某些特定数据类型的其他签名。将它作为一个包罗万象可能会很好,但它们通常是潜伏的陷阱。

标签: java null overloading


【解决方案1】:

方法解析通过选择适用于给定参数的最具体方法来工作。在您的第一种情况下,StringObject 更“具体”(因为它是Object 的子类),因此选择了String 方法。

当您添加另一个采用StringBuilder 的方法时,该方法和String 方法都同样“特定”(它们都是Object 的直接子类),因此对于哪个应该是模糊的选择,因此错误。

【讨论】:

    【解决方案2】:

    为什么它打印字符串而不是对象?

    java 编译器选择具有最具体最不通用参数的方法。由于Object是所有类(包括String)的超类,所以选择String类。

    为什么添加第三个方法会出现编译错误?

    由于StringStringBuilder 低于Object,编译器会发现调用不明确 因为StringStringBuilder 都可以接受null,所以编译器无法确定要调用的方法,因此在编译期间会出错。

    如果您尝试使用IOExceptionFileNotFoundException 而不是StringStringBuilder 进行相同的操作,您会发现FileNotFoundException 被选中,因为它最不通用。

    【讨论】:

      【解决方案3】:

      如果 String 继承自 Object,它们在继承链中,null 匹配两者,编译器选择更具体的类型 - String。

      如果 2 String 和 StringBuilder 不在继承链中,编译器无法选择更具体的类型。

      重载方法解析的详细信息在 JLS 15.12.2 中进行了描述。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-27
        • 1970-01-01
        • 2016-04-27
        相关资源
        最近更新 更多