【问题标题】:Why constructor call is not ambiguous in the following example? [duplicate]为什么在下面的例子中构造函数调用没有歧义? [复制]
【发布时间】:2014-04-27 17:17:39
【问题描述】:
class Test {

   public Test(Object obj) {
      System.out.println("Object");
   }

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

    public static void main(String[] args) {
       new Test(null); //prints String. Why not Object?
    }
}

如果我添加另一个参数类型为 Integer 的构造函数,或者,对于任何其他类型,调用 new Test(null); 会导致编译错误 - The constructor Test(Object) is ambiguous

为什么上面的例子没有产生错误?在执行它时,会调用带有参数String 的构造函数。为什么不调用参数类型为Object 的构造函数?这种歧义是如何解决的?

【问题讨论】:

    标签: java constructor


    【解决方案1】:

    //打印字符串。为什么不反对?

    因为编译器选择最具体的类型。

    如果我添加另一个参数类型为 Integer 的构造函数,或者,对于 任何其他类型都重要,调用 new Test(null);结果是 编译错误 - 构造函数 Test(Object) 不明确。

    现在StringInteger 在对象层次结构中处于同一级别,因此,编译器无法从这两者中选择一个

    【讨论】:

      【解决方案2】:

      因为它是由最具体的参数类型决定的。

      既然 String 是 Object 的子类,而 null 是任何东西的子类型,那么调用第二个构造函数,因为 String 比 Object 更具体。

      【讨论】:

        【解决方案3】:

        编译器被设计用来拾取与参数中发送的值非常匹配的重载方法。

        【讨论】:

          猜你喜欢
          • 2011-04-18
          • 1970-01-01
          • 2012-11-16
          • 2018-03-14
          • 2014-01-13
          • 1970-01-01
          • 2012-02-28
          • 1970-01-01
          相关资源
          最近更新 更多