栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

  • JLS 15.12.2:您的用例属于阶段3:

第三阶段(第15.12.2.4节)允许将重载与可变arity方法,装箱和拆箱相结合。

  • 然后,JLS 15.12.2.4基本上确定这两种方法均适用,因为可以将10转换为an
    Integer...
    或an
    int...
    。到目前为止,一切都很好。并得出以下结论:

在适用的可变引数方法中选择最具体的方法(第15.12.2.5节)。

  • 这使我们进入JLS 15.12.2.5。本段给出了一种条件方法,在这种条件下,一种Arity方法
    m(a...)
    比另一种Arity方法更具体
    m(b...)
    。在只有一个参数且没有泛型的用例中,它可以归结为:

m(a...)
m(b...)
iif 更具体
a <: b
,其中
<:
表示
is a subtype of

它发生

int
是不是一个亚型
Integer
Integer
是不是一个亚型
int

因此,要使用JLS语言,这两种

call
方法都是最大特定的(没有一种方法比另一种更特定)。在这种情况下,同一段的结论是:

  • 如果所有最大特定方法都具有等效的重写签名(第8.4.2节)[…] _=

    不是您的情况,因为不涉及泛型,并且Integer和int是不同的参数_

  • 否则,我们说方法调用是模棱两可的,并且会发生编译时错误。

注意

如果更换

Integer...
long...
,例如,你必须
int <: long
和最具体的方法是
call(int...)
*。
同样,如果您将替换
int...
Number...
,则该
call(Integer...)
方法将是最具体的。

*实际上,在Java 7之前的JDK中存在一个错误,在这种情况下会显示一个不明确的调用



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/469457.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号