【发布时间】:2023-03-18 11:22:02
【问题描述】:
我偶然发现了这个 sn-p:
public class ParamTest {
public static void printSum(int a, double b) {
System.out.println("In intDBL " + (a + b));
}
public static void printSum(long a, long b) {
System.out.println("In long " + (a + b));
}
public static void printSum(double a, long b) {
System.out.println("In doubleLONG " + (a + b));
}
public static void main(String[] args) {
printSum(1, 2);
}
}
这将导致编译错误:
Error:(15, 9) java: 对 printSum 的引用不明确,ParamTest 中的方法 printSum(int,double) 和 ParamTest 中的方法 printSum(long,long) 匹配
这怎么模棱两可?由于第一个参数已经是 int,在这种情况下不应该只提升第二个参数吗?在这种情况下不需要提升第一个参数对吗?
如果我更新代码添加另一个方法,编译成功:
public static void printSum(int a, long b) {
System.out.println(String.format("%s, %s ", a, b));
}
让我扩展只是为了澄清。下面的代码导致歧义:
public class ParamTest {
public static void printSum(int a, double b) {
System.out.println("In intDBL " + (a + b));
}
public static void printSum(long a, long b) {
System.out.println("In long " + (a + b));
}
public static void main(String[] args) {
printSum(1, 2);
}
}
那么下面的这段代码也会导致歧义:
public class ParamTest {
public static void printSum(int a, double b) {
System.out.println("In intDBL " + (a + b));
}
public static void printSum(double a, long b) {
System.out.println("In doubleLONG " + (a + b));
}
public static void main(String[] args) {
printSum(1, 2);
}
}
但是这个不会导致歧义:
public class ParamTest {
public static void printSum(int a, double b) {
System.out.println("In intDBL " + (a + b));
}
public static void printSum(long a, double b) {
System.out.println("In longDBL " + (a + b));
}
public static void main(String[] args) {
printSum(1, 2);
}
}
【问题讨论】:
-
编译器可以映射你的调用 printSum(1, 2);到 printSum(long a, long b) 或 printSum(int a, double b) 因此它是模棱两可的。您必须明确地帮助编译器进行选择,具体方式如下: printSum(1, 2d)
-
你错误地引用了错误信息,区别很重要。实际的错误消息是:
Error:(15, 9) java: reference to printSum is ambiguous both method printSum(int,double) in ParamTest and method printSum(long,long) in ParamTest match- 这不是模棱两可的方法,而是对方法的调用模棱两可。 -
@ErwinBolwidt 错误消息来自 Eclipse 抱歉,我在此处引用错误。无论如何,我仍然不明白,因为添加 printSum(int a, long b) 会删除错误消息。
-
JLS-5.3 => 如果表达式的类型不能通过松散调用上下文中允许的转换转换为参数的类型,则会发生编译时错误。 似乎适用于上下文,但很难直接推断出如何。 +1
-
我们绝对需要一个规范的问题:stackoverflow.com/…。"
标签: java java-8 type-promotion