【问题标题】:Why do I get an ambiguous error when calling a Constructor inside of the same class in Java?为什么在 Java 中调用同一类中的构造函数时会出现模棱两可的错误?
【发布时间】:2011-04-24 12:03:21
【问题描述】:

我不知道为什么会出现模棱两可的错误。这是我所拥有的示例代码:

public class MyString{
    //Data:
    private char[] theString;
    //constructors:
    public MyString(){ // default constructor
    }
    public MyString(String s){ // parameterized constructor
    }
    public MyString(char[] s){ // parameterized constructor
    }
    public MyString(MyString s){ // copy constructor
    }
    //A method that calls a constructor:
    public MyString foobar(){
        return new MyString(theString);
    }
}

当 foobar() 从其他地方调用时,上面会产生这个错误:

./MyString.java:15: reference to MyString is ambiguous, both method MyString(char[])
in MyString and method MyString(theString) in MyString match
                return new MyString(theString);
              ^

有什么想法吗?

【问题讨论】:

  • 由于此代码有效,您应该将无效代码提供给我们(在其他网站,例如 ideone 或 grepcode)。
  • 是该代码不起作用,还是与不起作用的代码相似
  • 我觉得奇怪的是,当它不包含类型时,错误会引用 method MyString(theString) 作为模棱两可的签名之一。
  • 当没有人能够重现这个问题时,谁在投票赞成这个问题?
  • 我认为这是一个编译器错误,我无法重现它。您使用的是什么版本的 JDK 和操作系统?另外,你能分享你调用 foobar() 的代码吗

标签: java methods constructor call ambiguous


【解决方案1】:

我无法重现您的错误。

但是这种错误基本上发生在你尝试调用一个函数并且编译器没有足够的类型信息来确定调用哪个方法时。

例如如果你这样做:

MyString tricky=new MyString(null);

然后编译器不知道 null 是指 char[] 还是 String 还是 MyString,因此您会收到一条模棱两可的错误消息。

解决此问题的常用方法是添加显式转换,例如:

MyString tricky=new MyString((String)null);

会工作....

【讨论】:

    【解决方案2】:

    啊哈!!我发现了问题。我的code 的第 260 行和第 261 行被意外切换了,因此编译器将我的返回函数视为一种方法。

    这相当于将上面的示例代码更改为这个错误的版本:

    public class MyString{
        //Data:
        private char[] theString;
        //constructors:
        public MyString(){ // default constructor
        }
        public MyString(String s){ // parameterized constructor
        }
        public MyString(char[] s){ // parameterized constructor
        }
        public MyString(MyString s){ // copy constructor
        }
        //A method that calls a constructor:
        public MyString foobar(){
        }
            return new MyString(theString); //THIS LINE WAS OUT OF PLACE! SHOULD BE IN FOOBAR!
    }
    

    【讨论】:

    • 但这应该会给你一个不同的编译器错误。类型的非法开头。
    • 实际上,在编译我的 main() 程序时,它没有给出那个错误,只有模棱两可的错误。然后,当我尝试自己编译 MyString 类时,它确实给了我这个错误。无论我编译什么(AppDriver vs Class),它是否应该给出相同的错误?
    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 2011-06-06
    • 2018-03-02
    • 2011-07-07
    • 2013-11-04
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多