首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么方法重载与装箱&扩大化导致歧义错误?

为什么方法重载与装箱&扩大化导致歧义错误?
EN

Stack Overflow用户
提问于 2014-04-11 20:24:47
回答 2查看 170关注 0票数 0
代码语言:javascript
复制
public class Aman {
    void m(Byte b, Integer i) {     // autoboxing, autoboxing

    }
    void m(Number n, int i) {       // autoboxing -> widening, no conversion

    }
    public static void main(String[] args) {
        byte b = 23;
        Aman obj = new Aman();
        obj.m(b, 24);
    }
}

我读过这个http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2文档,但可以

请有人一步一步地解释为什么方法调用会产生不明确的错误,通过

本文档中描述的步骤。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-11 20:31:58

首先,没有不使用装箱/取消装箱的适用方法签名,因此编译器将查找所有适用于装箱(规范参考)的签名。这两种方法都是适用的。

然后,它检查其中一个是否比另一个更具体。这要求一个方法的每个参数类型都是另一个方法的相应参数类型的子类型。由于是不可比拟的,调用是不明确的。

调用m(Integer)和m(int)的原因通常不是模棱两可的,因为在考虑装箱之前,在链接规范的“第一阶段”中找到了适当的方法。在这里,您可以通过将调用更改为:

代码语言:javascript
复制
obj.m(Byte.valueOf(b), 24);
票数 1
EN

Stack Overflow用户

发布于 2014-04-11 20:31:37

从您的连系文档中

第一阶段(§15.12.2.2)执行重载解析,不允许装箱或取消装箱转换,也不允许使用可变的方法调用。如果在此阶段没有找到适用的方法,则处理将继续到第二阶段。

这里什么都不会发生,因为没有任何方法匹配(byte, int)而不装箱其中的一个参数。

第二阶段(§15.12.2.3)在允许装箱和取消装箱的同时执行过载解析,但仍然排除了变量性方法调用的使用。如果在此阶段没有找到适用的方法,则处理将继续到第三阶段。

在这个步骤中,如果对参数执行一些装箱操作,这两个方法都匹配。如果选择byte,则参数匹配

代码语言:javascript
复制
void m(Number n, int i) {   

如果选择byteint,则参数匹配。

代码语言:javascript
复制
void m(Byte b, Integer i) {  

因此,有几种方法是适用的。

如果在适用性测试的三个阶段中的一个阶段已经确定了几种适用的方法,那么就选择最具体的方法,如§15.12.2.5节所规定的那样。

如果您遍历所有这些规则,您会发现没有更具体的方法,因此调用是不明确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23021946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档