java - 带有 null 的方法重载选择

标签 java overloading

给定这段代码:

class Overloading
extends Object
{

static public void target(Object val, String chk) { System.out.println("Object["+val+"] :: Should be "+chk); }
static public void target(String val, String chk) { System.out.println("String["+val+"] :: Should be "+chk); }

static public void main(String[] args) {
    Object                              obj=null;

    target(null        ,"Object");
    target((Object)null,"Object");
    target(obj         ,"Object");
    }
}

输出(出乎意料地)如下:

String[null] :: Should be Object
Object[null] :: Should be Object
Object[null] :: Should be Object

问题出在第一行,我希望它与其他两行相同。此外,我发誓直到最近,编译器还会给我一个普通 null 调用的模糊调用警告。然而,使用 Java 5 和 6 进行编译和测试会产生相同的结果。

这对我来说是一个重要问题,因为我有很多代码使用这种模式,即使用不同类型的重载“默认”参数来选择返回类型并推断所需的转换/解析。谁能解释一下这是怎么回事?

最佳答案

Java 一直以相同的方式工作:始终选择“最具体”的适用重载。由于 StringObject 的子类,因此它“更具体”,因此选择了 String 重载。如果重载是为了 StringInteger,并且您试图传递 null,那么您确实会遇到编译时歧义错误,因为它们都处于同一继承层次结构的同一级别。

关于java - 带有 null 的方法重载选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7198927/

相关文章:

overloading - 如何在编程语言中消除对象/类之间的运算符定义歧义?

c++ - 函数的模糊引用/值版本

java - 使用递归来填充数组,而不实现方法重载?

c++ - map 的重载 << 运算符

java - Android Studio 3.0.1(错误 :The 'java' plugin has been applied, 但与 Android 插件不兼容。)

java - 这种方法有什么问题吗?

Java 从 servlet 调用 EJB

java - 为什么 Eclipse 在另一个类中使用时不能处理 @value?

java - 返回扩展类的类型给平台声明冲突

swift - 在 Swift 中重载泛型函数时出现 "Ambiguos use of function"