求问:为什么可变参在使用的时候下面这种情形会报错?
public class OverloadingVarargs2 {
static void f(float i, Character... args) {
System.out.print("first");
for (Character c : args) {
System.out.print(" " + c);
}
System.out.println();
}
static void f(Character... args) {
System.out.print("second");
for (Character c : args) {
System.out.print(" " + c);
}
System.out.println();
}
public static void main(String[] args) {
// Character[] c = new Character[]{'a','b'};
// f(1,c);
// f(c);
// f(1,'a');
// f('a','b');
f('a');
}
}
报错内容
java: 对f的引用不明确
array_initialization.OverloadingVarargs2 中的方法 f(float,java.lang.Character...) 和 array_initialization.OverloadingVarargs2 中的方法 f(java.lang.Character...) 都匹配
思考:传入的是一个基本数据类型char,而可变参接收的是一个引用数据类型的数组
测试一下引用数据类型的装箱自动装箱,和基本数据类型的隐式转换谁更厉害
public class OverloadingVarargs2 {
// static void f(float i, Character... args) {
// System.out.print("first");
// for (Character c : args) {
// System.out.print(" " + c);
// }
// System.out.println();
// }
static void f(Character c){
System.out.println("aa");
}
static void f(float c){
System.out.println("bb");
}
// static void f(Character... args) {
// System.out.print("second");
// for (Character c : args) {
// System.out.print(" " + c);
// }
// System.out.println();
// }
public static void main(String[] args) {
// Character[] c = new Character[]{'a','b'};
// f(1,c);
// f(c);
// f(1,'a');
// f('a','b');
f('a');
}
}
上述代码打印的竟然是bb
所以是不是方法 static void f(float i, Character... args),也可以类似于是一种强化版的 static void f(Character c,Character... args),这么看,当然会有冲突了。
这时再看,虽然Java用了很长时间,但是这些基础部分的内容还是很薄弱啊。
下面是作者的瞎掰时间,虽说是瞎掰,但也是作者资源有限,展开一些自己的想象,希望有大佬看到我瞎掰时的错误,给予指导才是关键。嘻嘻,纯纯用来骗正确答案的
开始瞎掰
听说Java的自动装箱其实是等于调用包装类中的valueOf(type t)方法,可以随便看一个的源码中的该方法,发现这是一个public类型的静态方法,那方法 static void f(Character c) 是不是就等于是相当于最开始是更想接收一个引用数据类型呢,而 static void f(float c) 一直是更想接收基本数据类型,static void f(Character c) 方法,在处理接收到 char 类型的时候,更像是在无计可施的时候调用了Character c = Character.valueOf('c'),来弥补的一种措施,而static void f(float c) 则是在接收的时候就开始进行转型。
瞎掰终究是瞎掰,正确答案待更...