Java类型促进参数

riruzen:

我偶然发现了这个片段:

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);
    }
}

这将导致一个编译错误:

错误:(15 9)的java:参照printSum是不明确的两个方法printSum(INT,双)在ParamTest和方法printSum(长,长)在ParamTest匹配

这是怎么暧昧?不仅要第二个参数在这种情况下,因为推广的第一个参数已经是一个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);
    }
}
骚乱:

我觉得这是与JLS的有关具体规则15.12.2.5。选择最具体的方法它指出:

如果不止一个成员方法既方便和适用于方法调用,就必须选择一个提供运行时方法调度描述符。Java编程语言使用的是选择了最具体方法的规则。

如何Java的选择了最具体的方法是通过文本进一步解释说:

非正式的直觉是一种方法是更具体的比另一个如果第一种方法处理的任何调用可以到另一个没有编译时错误传递。在例如显式类型lambda表达式参数(§15.27.1)或可变元数调用(§15.12.2.4),一定的灵活性允许一个签名适应其他。

在您的例子中,所有的方法都可以访问,适用于方法调用,因此,Java需要确定哪些是最具体的

对于这些方法,没有人能确定更具体:

public static void printSum(int a, double b) {
    System.out.println("In intDBL " + (a + b));
} // int, double cannot be passed to long, long or double, long without error

public static void printSum(long a, long b) {
    System.out.println("In long " + (a + b));
} // long , long cannot be passed to int, double or double, long without error

public static void printSum(double a, long b) {
    System.out.println("In doubleLONG " + (a + b));
} // double, long cannot be passed to int, double or long, long without error

第四种方法清除不确定性恰恰是因为它满足了必要条件是最特殊的

public static void printSum(int a, long b) {
    System.out.println(String.format("%s, %s ", a, b));
}

也就是说,(的int,long)可以传递给(INT,双),(很久很久),或(双长)没有编译错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章