使用Boxing / Widening进行Java方法重载

时间:2013-03-19 06:57:36

标签: java overloading scjp

我正在研究Java Se 7 OCA,并且无法弄清楚为什么下面的代码无法编译。 main方法中的aMethod调用给出了编译错误,说明了模糊方法。扩展和装箱之间的优先规则似乎在这个重载方法样本中发生冲突。

public class Overloading {
public static void main(String[] args) {
    Byte i = 5;
    byte k = 5;
    aMethod(i, k);
}

static void aMethod(byte i, Byte k) {
    System.out.println("Inside 1");
}

static void aMethod(byte i, int k) {
    System.out.println("Inside 2");
}

static void aMethod(Byte i, Byte k) {
    System.out.println("Inside 3 ");
}
}

错误是“方法aMethod(byte,Byte)对于Overloading类型”是不明确的。 当我注释掉第一种方法时,它会为第二种方法提供相同的错误。

我的想法是: 第一种方法需要拆箱和装箱 第二种方法需要拆箱和扩大 第三种方法只需拳击。 所以它必须是第三种方法,因为它需要最少的转换,并且所有这些方法都有装箱转换。

4 个答案:

答案 0 :(得分:0)

这个课你有两个相同的方法

static void aMethod(Byte i, Byte k) {
    System.out.println("Inside 3 ");
}

static void aMethod(byte i, Byte k) {
    System.out.println("Inside 1");
}

字节自动转换字节,所以编译错误

答案 1 :(得分:0)

问题在于所有这些方法:

static void aMethod(byte i, Byte k) {
    System.out.println("Inside 1");
}

static void aMethod(byte i, int k) {
    System.out.println("Inside 2");
}

static void aMethod(Byte i, Byte k) {
    System.out.println("Inside 3 ");
}

Java不知道,它应该在线调用哪一个:

    aMethod(i, k);

根据JLS 规范,您的参数ik可以通过各种方式进行转换:

i可以是unboxedbyte(5.1.8),也可以是[{1}}(5.1.1) - > 2个变种

Byte可以k进入boxed(5.1.7)或加宽到Byte类型(5.1.2) - > 2个变种。

答案 2 :(得分:0)

实际上不是定义,但是电话是模棱两可的。 因为,默认情况下java中的所有整数都是int。即使你说字节b = 5,5也会在内部转换为int进行任何操作。但由于引用是字节,在您的情况下,它可以选择调用方法2&所以编译器无法理解要调用的内容。

所以aMethod(i, (Byte)k)应该有用。

答案 3 :(得分:0)

method overloading in Java

时应牢记以下几点
  1. 扩展原始类型使用下一个更宽的类型 方法参数,如果未找到完全匹配。

  2. Boxing和var-args与方法重载兼容 单独使用。

  3. 一种包装类型无法扩展到另一种类型。例如,Integer 无法扩展为Long。

  4. 加宽后跟拳击不起作用。例如,int不能 被传递给Long。

  5. 拳击后加宽作品只在一种情况下装箱 参数传递给Object类型引用。可以传递一个int 通过整数到对象。

  6. Var-args可以与加宽或装箱相结合,但是 小心。

  7. 在上面的代码中,传递给aMethod的参数应该是适当的类型化的,因​​为Java中的中间结果是在int表达式中的int中转换的。