当前位置: 首页 > 面试题库 >

在Java中的重载方法中使用null

毛淳
2023-03-14
问题内容

以下代码可以编译并正常运行。

public class Main
{
    public void temp(Object o)
    {
        System.out.println("The method with the receiving parameter of type Object has been invoked.");
    }

    public void temp(String s)
    {
        System.out.println("The method with the receiving parameter of type String has been invoked.");
    }

    public void temp(int i)
    {
        System.out.println("The method with the receiving parameter of type int has been invoked.");
    }

    public static void main(String[] args)
    {
        Main main=new Main();
        main.temp(null);
    }
}

在此代码中,要调用的方法是接受type参数的方法 String

该文档说。

如果多个成员方法既可访问又可应用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。Java编程语言使用选择最具体方法的规则。

但是我不明白何时将接受原始参数的代码中的方法之一int修改为接受包装器类型的参数,Integer例如,

public void temp(Integer i)
{
    System.out.println("The method with the receiving parameter of type Integer has been invoked.");
}

发出编译时错误。

对temp的引用含糊不清,methodoverloadingpkg.Main中的方法temp(java.lang.String)和methodoverloadingpkg.Main中的方法temp(java.lang.Integer)都匹配

在这种特殊情况下,为什么用原始数据类型重载一个方法却合法,但是用相应的包装器类型似乎不是这种情况?


问题答案:

如果询问您什么是更专业的“字符串”或“对象”,您会说什么?显然是“字符串”,对不对?

如果您被问到:什么是更专业的“字符串”或“整数”?没有答案,它们都是对象的正交专业,如何在它们之间进行选择?然后,您必须明确要选择哪一个。例如,通过投射空引用:

question.method((String)null)

当您使用基本类型时,您不会遇到问题,因为“ null”是引用类型,并且不能与基本类型冲突。但是,当您使用引用类型时,“
null”可以引用String或Integer(因为null可以强制转换为任何 引用 类型)。

请参阅我在评论中发布的其他问题的答案,以获取更多,更深入的细节,甚至还有JLS的一些报价。
要回答标题中的问题:null既不是aString也不是an Object,但是可以将对a的引用分配给null。

我真的很惊讶该代码甚至可以编译。之前我尝试过类似的操作,但收到编译器错误,说该调用不明确。

但是,在这种情况下,似乎编译器正在选择食物链中最低的方法。假设您需要该方法的最不通用版本以帮助您。

我将不得不看看是否可以在这个(貌似)完全相同的场景中找到出现编译器错误的示例,不过…]

编辑: 我明白了。在我制作的版本中,我有两个重载方法,分别接受aString和an Integer。在这种情况下,没有“最具体的”参数(如Object和中String),因此与您的代码不同,它无法在它们之间进行选择。

很酷的问题!



 类似资料:
  • 可能重复:NULL参数的方法重载 以下代码编译并运行良好。 在此代码中,要调用的方法是接受字符串类型参数的方法 医生说。 如果多个成员方法既可访问又适用于方法调用,则需要选择一个来为运行时方法调度提供描述符。Java编程语言使用选择最具体方法的规则。 但我不明白,当代码中接受原语int参数的方法之一被修改为接受包装器类型Integer的参数时,例如, 发出编译时错误。 对temp的引用不明确,me

  • 本文向大家介绍在Java中使用方法重载,包括了在Java中使用方法重载的使用技巧和注意事项,需要的朋友参考一下 一个类可以有多个具有相同名称的方法,但方法的参数列表不应相同。这称为方法重载。方法重载有点类似于构造函数重载。 演示此的程序如下所示- 示例 输出结果 现在让我们了解上面的程序。 在方法重载的实现中,使用三种方法创建PrintValues类。其中一个采用int类型的参数,另一个采用dou

  • 问题内容: 以下代码无法编译。 发出编译时错误。 对test的引用是模棱两可的,varargspkg.Main中的方法test(int …)和varargspkg.Main中的方法test(float …) 这似乎很明显,因为方法调用中的参数值可以提升为 如果任何一个或两个参数都带有或作为后缀,则会进行编译。 但是,如果我们用相应的包装器类型表示方法签名中的接收参数,如下所示 那么对该方法的调用不

  • 我有一个Foo和Bar对象的列表,以及每个相应对象的转换器。 Convert-method需要有所不同,因为Bar1与Bar2和Bar3等有很大不同,但是我想创建一个方法来处理所有可能的列表。 是否可以创建一个泛型方法,根据列表的内容调用相应的非泛型方法? 到目前为止,我已经尝试过了: 但这并不能编译,因为"无法解析方法'Converts(T, S)'" 有什么想法吗?

  • 我正在尝试用Python实现方法重载: 但输出是第;同样地: 给予 我该怎么做呢?

  • 问题内容: 这是我对Java中的重载解析的了解: 编译器尝试从给定的重载方法定义中解析方法调用的过程称为重载解析。如果编译器找不到确切的匹配项,则仅通过使用向上转换来查找最接近的匹配(永远不会进行向下转换)。 这是一堂课: 如预期的那样,输出为10。 但是,如果我稍微更改类定义并更改第二个重载方法。 输出为8。 在这里我很困惑。如果从不使用向下转换,那么为什么只打印8个?为何编译器会选择以参数为参