java - 编译器的模糊参数,当它对我来说不模糊时

标签 java compiler-construction

为什么编译器会在这里提示?

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/

相关文章:

java - JTextField 上的 setBorder 不起作用?或者是吗?

减少行间垂直间距的Java代码

c - 如何用 C 语言编写编译器?

c - 视觉 C++ 2008 表达

java - JTextField 使用不当(可能)帮助创建 GUI

java - 如何使用 super() 进行 Frame() 的内部构造?

java - 如何在java android中给出 'for loop'的时间间隔

java - ANTLR 中解析输入时出错

java - 消除 CXF 生成的代码中对 javax.xml.bind.JAXBElement<java.lang.Boolean> 的冗余强制转换警告

c# - 如何区分 Null 或 Empty ?根据什么标准处理 Null 和 Empty?