为什么编译器会在这里提示?
public static void main(String[] args) {
flipFlop(new Integer(11), 20f);
}
private static void flipFlop(int i, Float iRef) {
}
private static void flipFlop(int i, float j) {
}
但不在这里?
public static void main(String[] args) {
flipFlop(11, 20f);
}
private static void flipFlop(int i, Float iRef) {
}
private static void flipFlop(int i, float j) {
}
这很奇怪,因为这两种情况都应该解决。
在某些情况下,只有第二个参数可能会变得不明确,但第一个参数不会。那么为什么如果我改变第一个它会提示呢。
最佳答案
当有多种方法适用时,编译器会尝试找到最具体的一种。如果两种方法非常具体,则存在歧义并且您会收到错误。
总而言之(actual rules 稍微复杂一些):
- 编译器首先寻找适用的方法,不允许使用可变参数或(取消)装箱。在您的第二个示例中,仅适用并选择第二种方法。在第一个示例中,需要对 Integer 进行拆箱,并且此阶段无法选择任何方法。
- 然后编译器允许装箱和拆箱。在您的第一个示例中,这两种方法都适用。
- 编译器然后确定 which method is more specific :在你的情况下,没有一个在规范中定义的意义上更具体,因为 float 和 Float 之间没有关系(例如:如果你有一个 float 和一个 double,float 会更具体;如果你有一个 Float 和一个数字、 float 会更具体)。
关于java - 编译器的模糊参数,当它对我来说不模糊时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18031390/