Java中的模糊重载

Java中的模糊重载,java,overloading,Java,Overloading,我正在学习Java,遇到了一些关于重载的问题。以以下函数使用为例: f('a', 'a'); 如果我们有两个定义: static void f(int i, char j){ System.out.println("int_char"); } static void f(double i, char j){ System.out.println("double_char"); } 会好的。因为所有第二个参数都完全匹配。但是第一个参数,它们都使用加宽。字符的加宽顺序为: ch

我正在学习Java,遇到了一些关于重载的问题。以以下函数使用为例:

f('a', 'a');
如果我们有两个定义:

static void f(int i, char j){
    System.out.println("int_char");
}

static void f(double i, char j){
    System.out.println("double_char");
}
会好的。因为所有第二个参数都完全匹配。但是第一个参数,它们都使用加宽。字符的加宽顺序为:

char -> int -> long -> float -> double
char要实现int,需要一个步骤。但要实现双倍增长,需要4个步骤。因此,结果是:

int_char
但我将参数的顺序更改为:

static void f(int i, char j){
    System.out.println("int_char");
}

static void f(char i, double j){
    System.out.println("char_double");
}
编译器会提出一个不明确的错误。为什么?

另一种情况如下:

static void f(char i, Character j){
    System.out.println("char_Character");
}

static void f(Character i, Character j){
    System.out.println("Character_Character");
}
第二个参数都使用atuoboxing。但是void f的第一个参数(char i,Character j)是完全匹配的。为什么这两个功能一起会导致歧义

最后,如果这些函数中的任何一个出现以下函数:

static void f(Character... i){
    System.out.println("Character_varargs");
}
输出不是字符_varargs,因为加宽>装箱>varargs。但当两个模棱两可的函数与字符_varargs一起使用时,一个类似:

static void f(char i, Character j){
    System.out.println("char_Character");
}

static void f(Character i, Character j){
    System.out.println("Character_Character");
}

static void f(Character... i){
    System.out.println("Character_varargs");
}
结果将是Character_varargs。为什么?

甚至我们在重载函数中添加了一些不含糊且优先级更高的函数,如:

static void f(int i, char j){
    System.out.println("int_char");
}

static void f(char i, double j){
    System.out.println("char_double");
}

static void f(int i, double j){
    System.out.println("int_double");
}

static void f(Character... i){
    System.out.println("Character_varargs");
}
结果仍然是Character_varargs。为什么?如果只考虑空隙F(int i,双j)和空隙f(字符i),输出应该是int双。 当编译器遇到不明确的函数时,它是否直接“跳转”到varargs函数(如果有),而不考虑任何其他候选函数


谢谢

加宽>装箱>变量不完全正确

适当的是加宽>装箱和拆箱>加宽和装箱/拆箱和变量三者

在第三步中,所有三个都是允许的

static void f(int i, char j){
    System.out.println("int_char");
}

static void f(double i, char j){
    System.out.println("double_char");
}
在上述情况下,您可以根据1个特定参数上的加宽距离,按优先顺序“排列”它们。但在下面你不能安排它们

static void f(int i, char j){
    System.out.println("int_char");
}

static void f(char i, double j){
    System.out.println("char_double");
}

下一个问题是

static void f(char i, Character j){
    System.out.println("char_Character");
}

static void f(Character i, Character j){
    System.out.println("Character_Character");
}
当需要允许使用装箱进行匹配时(因为没有装箱就没有匹配),所有在第一个或第二个参数上使用或不使用装箱的方法都会以相同的优先级处理。因此,第一个并不比第二个好,因此我们不能按优先顺序排列它们。导致模棱两可

现在如果下面也出现了

static void f(Character... i){
    System.out.println("Character_varargs");
}
根据规则,由于装箱/取消装箱后未找到合适的方法(发现2个不明确的方法),因此需要使用var args执行第三步。最终找到要解决的方法


在下面的例子中,我们还需要进行第三步(加宽和装箱/拆箱以及变位)以找到匹配项

static void f(int i, char j){
    System.out.println("int_char");
}

static void f(char i, double j){
    System.out.println("char_double");
}

static void f(int i, double j){
    System.out.println("int_double");
}

static void f(Character... i){
    System.out.println("Character_varargs");
}

请参阅

,本手册对此进行了详细说明。你在那里彻底研究过了吗?@JimGarrison对不起。我刚刚学了整整两天Java。我以前真的不知道那个材料。我正试图找出答案。谢谢你的建议。