dre*_*ash 13 java null overloading
我有以下代码片段:
public static void foo(Object x) {
System.out.println("Obj");
}
public static void foo(String x) {
System.out.println("Str");
}
Run Code Online (Sandbox Code Playgroud)
如果我打电话foo(null)为什么没有歧义?为什么程序调用foo(String x)而不是foo(Object x)?
Roh*_*ain 21
为什么程序调用
foo(String x)而不是foo(Object x)
这是因为String类扩展Object,因此更具体Object.因此,编译器决定调用该方法.请记住,编译器总是选择最具体的方法来调用.请参见JLS的第15.12.5节
如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符.Java编程语言使用选择最具体方法的规则.
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体.
但是,如果你有两个方法带参数 - String,和Integer,那么你会得到ambiguity错误null,因为编译器无法确定哪一个更具体,因为它们是非协变类型.
根据null定义,类型是每个其他引用类型的子类型.引用JLS 4.1:
null引用总是可以进行任何引用类型的扩展引用转换.
调用中涉及的方法签名的解析遵循所有兼容签名集中最特定签名的原则.(JLS 15.12.2.5.选择最具体的方法).
这意味着String在您的示例中选择了重载.
| 归档时间: |
|
| 查看次数: |
731 次 |
| 最近记录: |