Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编译器错误:调用的引用不明确_Java_Methods_Polymorphism_Java 7_Boxing - Fatal编程技术网

Java 编译器错误:调用的引用不明确

Java 编译器错误:调用的引用不明确,java,methods,polymorphism,java-7,boxing,Java,Methods,Polymorphism,Java 7,Boxing,案例1 static void call(Integer i) { System.out.println("hi" + i); } static void call(int i) { System.out.println("hello" + i); } public static void main(String... args) { call(10); } 案例1的输出:hello10 案例2 static void call(Integer... i) {

案例1

static void call(Integer i) {
    System.out.println("hi" + i);
}

static void call(int i) {
    System.out.println("hello" + i);
}

public static void main(String... args) {
    call(10);
}
案例1的输出:hello10

案例2

static void call(Integer... i) {
    System.out.println("hi" + i);
}

static void call(int... i) {
    System.out.println("hello" + i);
}

public static void main(String... args) {
    call(10);
}

显示编译错误
引用以调用不明确的
。但是,我无法理解。为什么?但是,当我从
案例2中注释掉任何
call()
方法时,它就可以正常工作了。谁能帮我理解一下,这里发生了什么事?

编译器不知道应该调用哪个方法。为了解决这个问题,您需要强制转换输入参数

public static void main(String... args) {
  call((int)10);
  call(new Integer(10));
}
编辑:


这是因为编译器试图将整数转换为int,因此,在调用
调用
方法之前会进行隐式转换。因此,编译器然后会查找任何可以接受int的同名方法。您有两个,因此编译器不知道应该调用这两个函数中的哪一个。

看起来它与相关,这在OpenJDK 7中似乎是固定的

下面是错误描述

错误描述:

当调用具有以下重载签名的方法时,I 预期出现歧义错误(假设参数与 两者):

javac认为第二个比第一个更具体。这 行为是明智的(我更喜欢),但与JLS不一致 (15.12.2)

JLS 15.12.2.2选择最具体的方法

IIf有多个方法声明可访问且适用 对于方法调用,必须选择一个来提供 运行时方法分派的描述符。Java编程 语言使用的规则是选择最具体的方法。这个 非正式的直觉是一个方法声明更具体 如果第一个方法处理的任何调用可以 在没有编译时类型错误的情况下传递给另一个


这两种方法都不能传递给其他方法(int[]和Integer[]的类型不相关),因此,如果可以应用多个方法,则调用是不明确的,而不是Java语言规范中的段落
15.12.2.5

一个名为
m
的变量arity成员方法比另一个同名的变量arity成员方法更具体,如果其中一个(
多次出现这个问题。棘手的部分是
f(1,2,3)
显然在传递
int
,那么为什么编译器不能选择
f(int…)
version?答案一定在我挠头的地方

根据§15.12.2.4,两种方法都适用于变量算术方法,因此下一步是确定最具体的方法

使用子类型test Ti Integer或Integer:>int。本段末尾说明:

上述条件是唯一可以使用一种方法的情况 可能比另一个更具体。[…]

方法m1比另一种方法m2更具体,如果 只有当m1比m2更具体,m2也不是更具体时 而不是m1

对于方法调用,方法被称为最大特定的 如果它是可访问和适用的,并且没有其他方法 是适用的和可访问的,严格来说是更具体的

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

  • [……]

  • 否则,我们会说方法调用是不明确的,并且会发生编译时错误


  • Gilad Bracha(见附件2)所附,并在@Jayamhona的答案的错误报告中链接。

    查找最具体的方法是在Java语言规范(JLS)中以非常正式的方式定义的。我在下面提取了适用的主要项目,同时尝试尽可能删除正式公式

    总之,适用于您的问题的主要项目有:

    • :您的用例属于第3阶段:
    第三阶段(§15.12.2.4)允许重载与可变算术方法、装箱和拆箱相结合

    • 然后基本上确定这两种方法都适用,因为10可以转换为
      整数…
      整数…
      。到目前为止还不错。本段总结如下:
    最具体的方法(§15.12.2.5)是从适用的变量算术方法中选择的

    • 这就引出了。本段给出了一个arity方法
      m(a…)
      比另一个arity方法
      m(b…)
      更具体的条件。在一个参数没有泛型的用例中,它归结为:

    m(a…)
    m(b…)更具体
    iif
    a你刚刚告诉了解决方案。我的问题是为什么?为什么它不起作用?任何参考?也就是说,它的java错误??你正在使用哪个版本的java。如果可能的话,也提供你的eclipse版本。你提到的错误会让事情在不应该的时候编译。这不是问题。请不要猜测你的版本。具体一点。I r我也问过你的eclipse版本(如果你正在使用eclipse的话)。我猜是jdk7,因为我不记得确切的版本。我的意思是,JDK1.7.0Å关于
    double[]
    int[]
    :它们也没有关系,但是用
    double
    替换
    Integer
    会删除编译错误(在jdk7+)。您会造成混淆:
    S1
    int
    ,而不是
    int[]
    @assylias
    S1
    方法参数之一,方法只有一个参数
    int[]
    Si
    定义为
    Si=Ui
    ,而U定义为
    U1,…,Uk-1,Uk[]
    Uk[]
    =>
    Uk int
    。如果不是这样的话,
    m(数字…
    )就不会更专业了
    int f(Object... args);
    int f(int... args);