得到错误:"构造函数HelloWorld(Float [])含糊不清"为什么?

时间:2015-06-15 17:18:06

标签: java

我有一个班级

public class HelloWorld {

    HelloWorld(Float[] a) {
    }

    HelloWorld(Double a) {
    }
}

在主程序中我这样做:

public static void main(String args[]) {
        HelloWorld helloWorld = new HelloWorld(null);
    }

eclipse显示"构造函数HelloWorld(Float [])含糊不清"为什么?

5 个答案:

答案 0 :(得分:10)

原因是index force lvdt id 0 0.002 0.002 23 1 0.002 0.002 24 可以被认为是任何类型。但是,nullFloat[]并不直接相关。 Double不是Float[]的子类型,Double不是Double的子类型。编译器看到两种适用的方法,但两种方法都不比另一种方法更具体。在这种情况下,编译器会生成错误,因为方法调用是不明确的;它不知道需要调用哪种方法。

Section 4.1 of the JLS州:

  

可以始终为空引用赋值或转换为任何引用类型(第5.2节,第5.3节,第5.5节)。

     

在实践中,程序员可以忽略null类型,只是假装null只是一个可以是任何引用类型的特殊文字。

此外,Section 15.12.2.5 of the JLS,关于选择最具体的方法,请说明:

  

有可能没有最具体的方法,因为有两种或更多种方法是最具体的。在这种情况下:

     
      
  • 如果所有最具体的特定方法都具有覆盖等效签名(§8.4.2),那么:

         
        
    • 如果具体的一个最具体的方法是具体的(即非抽象或默认),则它是最具体的方法。

    •   
    • 否则,如果所有最大特定方法都是抽象的或默认的,并且所有最大特定方法的签名都具有相同的擦除(§4.6),那么最具体的方法是在子集中任意选择的。具有最特定返回类型的最大特定方法。

           

      在这种情况下,最具体的方法被认为是抽象的。此外,当且仅当在每个最大特定方法的throws子句中声明了该异常或其擦除时,才会考虑使用最具体的方法抛出已检查的异常。

    •   
  •   
  • 否则,方法调用不明确,并发生编译时错误。

  •   

答案 1 :(得分:2)

当您尝试调用函数并且编译器没有足够的信息来确定要调用的方法时,会发生此错误。

在您的情况下,当您说new HelloWorld(null)时,它不知道null是指Float []还是Double。

答案 2 :(得分:1)

当您传递null时,您的程序会对要调用的构造函数感到困惑。因为两个构造函数都采用一个参数。现在它有两个选择。

一般来说,英语,ambigious意味着你有多种不可判断的方法来完成任务。

因此,在编程中,如果遇到歧义,如果没有明确处理歧义,应用程序就会崩溃。

答案 3 :(得分:0)

Float[]Double之间没有关系。这就是编译器变得含糊不清的原因。 Null可以解释为java中的任何引用。

假设您有Float[]Object,那么它将执行Float[]构造函数。 ObjectFLoat之间存在关联。所有包装类都是Object类的子类。 Float[]应该是更具体的类型。

参考:

Why does Java prefer to call double constructor?

答案 4 :(得分:0)

null没有定义类型,因此您的编译器不知道要选择哪一个。假装你是编译器,你看到HelloWorld()和HelloWorld()。你选哪一个?希望这会使你的歧义更加明显。