我已经添加了三个带参数的方法:

public static  void doSomething(Object obj) {
    System.out.println("Object called");
}

public static  void doSomething(char[] obj) {
    System.out.println("Array called");
}

public static  void doSomething(Integer obj) {
    System.out.println("Integer called");
}

当我调用doSomething(null)时,编译器抛出的错误为ambiguous methods.问题是因为Integerchar[]方法还是IntegerObject方法?

推荐答案

Java总是会try 使用现有方法的最具体的适用版本(参见JLS §15.12.2).

Objectchar[]Integer都可以将null作为有效值.因此所有3个版本都适用,所以Java必须找到最具体的一个.

因为Objectchar[]的超级类型,所以数组版本比Object版本更具体.因此,如果只有这两种方法存在,将 Select char[]版本.

char[]Integer版本都可用时,其中both个版本比Object更具体,但没有一个版本比另一个更具体,因此Java无法决定调用哪个版本.在这种情况下,您必须通过将参数强制转换为适当的类型来明确说明要调用哪个参数.

请注意,在实践中,这个问题的发生比人们想象的要少得多.其原因是,只有在使用null或非特定类型(如Object)的变量显式调用方法时,才会发生这种情况.

相反,下面的调用将是完全明确的:

char[] x = null;
doSomething(x);

尽管仍在传递值null,但Java确切地知道要调用哪个方法,因为它会考虑变量的类型.

Java相关问答推荐

无法从Spring Boot应用程序连接到SQL Docker服务器

如何在Inspaut中获取当前路径的 * 模式 *?

Java -使用空比较或instanceof?

伪类focus-in不适用于PFA中的选项卡

如何为具有多对多关系的实体的给定SQL查询构建JPA规范?

Java:根据4象限中添加的行数均匀分布行的公式

Java WireMock定义存根在Cucumber并行执行的多线程测试中失败

无法在org. openjfx:javafx—fxml:21的下列变体之间进行 Select

';com.itextpdf.ext.html.WebColors已弃用

名称冲突具有相同的擦除

我正在try 跟踪数组中最大的两个数字

SpringBoot Kafka自动配置-适用于SASL_PLAYTEXT的SSLBundle 包,带SCRAM-SHA-512

在学习Spring时,通过构造函数参数0表达了不满意的依赖关系

是否为计划任务补偿系统睡眠?

在使用具有不同成本的谓词调用allMatch之前对Java流进行排序会带来什么好处吗?

每次我需要时创建和关闭数据库连接会有什么效果吗?

Maven-Dependency-Plugin 3.6.+开始查找在依赖关系:分析目标期间找到的新的使用的未声明依赖关系

为什么我的登录终结点不能被任何请求访问?

无法在Java中获取ElastiCache的AWS CloudWatch指标

如果c不为null,Arrays.sort(T[]a,Comparator<;?super T>;c)是否会引发ClassCastException?