我正在研究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类型”是不明确的。 当我注释掉第一种方法时,它会为第二种方法提供相同的错误。
我的想法是: 第一种方法需要拆箱和装箱 第二种方法需要拆箱和扩大 第三种方法只需拳击。 所以它必须是第三种方法,因为它需要最少的转换,并且所有这些方法都有装箱转换。
答案 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 规范,您的参数i
和k
可以通过各种方式进行转换:
i
可以是unboxed
到byte
(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)
扩展原始类型使用下一个更宽的类型 方法参数,如果未找到完全匹配。
Boxing和var-args与方法重载兼容 单独使用。
一种包装类型无法扩展到另一种类型。例如,Integer 无法扩展为Long。
加宽后跟拳击不起作用。例如,int不能 被传递给Long。
拳击后加宽作品只在一种情况下装箱 参数传递给Object类型引用。可以传递一个int 通过整数到对象。
Var-args可以与加宽或装箱相结合,但是 小心。
在上面的代码中,传递给aMethod的参数应该是适当的类型化的,因为Java中的中间结果是在int表达式中的int中转换的。