1

我正在研究 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 ");
}
}

错误是“ The method aMethod(byte, Byte) is ambiguous for the type Overloading ”。当我注释掉第一种方法时,第二种方法会出现相同的错误。

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

4

4 回答 4

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规范i,您的参数可以通过各种方式进行转换:k

i可以unboxedbyte(5.1.8) 或保留为Byte(5.1.1) -> 2 个变体

k可以boxed进入Byte(5.1.7) 或扩大到int类型 (5.1.2) -> 2 个变体。

于 2013-03-19T07:10:29.947 回答
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");
}

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

于 2013-03-19T07:05:00.517 回答
0

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

所以aMethod(i, (Byte)k)应该工作。

于 2013-03-19T07:17:05.553 回答
0

在 Java 中方法重载时应牢记以下几点:

  1. 如果未找到完全匹配,则原始类型的扩展使用紧接的下一个更广泛的类型方法参数。

  2. 如果单独使用装箱和 var-args 与方法重载兼容。

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

  4. 加宽后拳击是行不通的。例如,不能将 int 传递给 Long。

  5. 如果将装箱参数传递给 Object 类型引用,则装箱后加宽仅在一种情况下有效。一个 int 可以通过 Integer 传递给一个 Object。

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

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

于 2015-06-15T06:48:27.400 回答