当前位置: 首页 > 知识库问答 >
问题:

在Java中的重载方法中使用null[重复]

艾浩广
2023-03-14

可能重复:NULL参数的方法重载

以下代码编译并运行良好。

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

在此代码中,要调用的方法是接受字符串类型参数的方法

医生说。

如果多个成员方法既可访问又适用于方法调用,则需要选择一个来为运行时方法调度提供描述符。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中的两个方法temp(java.lang.String)都不明确。methodoverloadingpkg中的Main和method temp(java.lang.Integer)。主要比赛

在这个特定的场景中,为什么用一个原始数据类型重载一个方法是合法的,而对应的包装器类型似乎不是这样?

共有3个答案

和选
2023-03-14

首先要了解为什么主。温度(空) 解析为temp(String s)而不是temp(Object o)我用null参数向您指出我以前对Java方法调度的回复。从本质上讲,文本为null和Object类型

现在,nullStringintger一样接近,所以当您添加test(intger)时,它变得模糊不清

子车高超
2023-03-14

如果将null作为重载方法的参数传递,则选择的方法是具有最特殊类型的方法,因此在这种情况下,选择的是字符串,而不是最宽容的对象。

Object/String/int中,编译器的选择很清楚:您将获得String的一个原因int不能是null,因此在这种情况下它对应的方法没有资格被调用。

但是,如果您将int更改为Intger,编译器将感到困惑,因为采用String的两种方法都与Intger的方法一样准确(层次结构中正交)。

编译器不能(不想?^^)随机选择。

丁雅惠
2023-03-14

如果有人问你什么是更专业的“字符串”或“对象”,你会说什么?显然是“字符串”,对吗?

如果有人问你:什么是更专业的“字符串”或“整数”?没有答案,它们都是对象的正交特化,您如何在它们之间进行选择?那么你必须明确你想要哪一个。例如,通过强制转换空引用:

question.method((String)null)

当您使用基元类型时,您不会遇到这个问题,因为“null”是引用类型,不能与基元类型冲突。但当您使用引用类型时,“null”可以引用字符串或整数(因为null可以转换为任何引用类型)。

请参阅我在上述评论中发布的另一个问题中的答案,以了解更多更深入的详细信息,甚至是JLS的一些引用。

 类似资料:
  • 问题内容: 以下代码可以编译并正常运行。 在此代码中,要调用的方法是接受type参数的方法 该文档说。 如果多个成员方法既可访问又可应用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。Java编程语言使用选择最具体方法的规则。 但是我不明白何时将接受原始参数的代码中的方法之一修改为接受包装器类型的参数,例如, 发出编译时错误。 对temp的引用含糊不清,methodoverload

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

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

  • 我在一个类中重载了以下2个方法: 当我调用方法testMethod时,它会打印“String”。 当我再添加一个重载方法时: 它抛给我编译器错误:是矛盾的。 当我用null调用方法时,所有这些都会发生 我的问题是: 为什么它打印字符串而不是对象? 为什么添加第三种方法会出现编译错误?

  • 我正在Java中练习一些例子。代码如下所示: 关于这一点,我没有什么问题, 1) 上面的代码使用method1(算术异常e)执行并打印null,为什么不使用异常(因为它位于层次结构的顶部)? 猜测:这是因为与异常相比,算术异常更加具体。如果是这样,为什么要问第二个问题 2) 通过在现有代码中引入以下方法,程序显示编译时异常。为什么? 帮助我学习。谢谢

  • 如果有人能在下面解释一下,那就太好了。为什么在下面的示例中调用了打印(字符串s)方法,而未调用打印(对象o)。