【问题标题】:Java - how are method overrides with compatible arguments handled?Java - 如何处理具有兼容参数的方法覆盖?
【发布时间】:2012-05-10 03:52:47
【问题描述】:

取以下代码:

public interface InterfaceA {    }
public interface InterfaceB {    }
public class Abba implements InterfaceA, InterfaceB {    }

public class MainThingy {
    public static void main(String[] args) {
        Abba abObj = new Abba();
        int result = MainThingy.doStuff(abObj);
    }
    private static int doStuff(InterfaceA param) {
        System.out.println("method A");
    }
    private static int doStuff(InterfaceB param) {
        System.out.println("method B");
    }
}

由于两个 doStuff() 方法都采用 Abba 参数,因此不清楚将调用哪一个。 Java 编译器和/或 JVM 如何处理这个问题?

【问题讨论】:

  • 既然你已经有了代码,你试了会发生什么?获取该信息并将其合并到帖子(标题和正文)中,并使用它来完善对该主题的搜索...
  • 对不起,我想我用错误的术语搜索。另外,你是绝对正确的,我应该尝试编译它。我不知道为什么我在写这篇文章时没有想到。

标签: java methods overloading


【解决方案1】:

简单。由于引用不明确,此代码无法编译。

$ javac MainThingy.java 
MainThingy.java:4: reference to doStuff is ambiguous, both method doStuff(InterfaceA) in MainThingy and method doStuff(InterfaceB) in MainThingy match
        MainThingy.doStuff(abObj);
                  ^
1 error

【讨论】:

  • 它也不会编译,因为doStuff 不返回int。
  • 第 2 部分)JVM 在确定/选择重载方面扮演什么角色(如果有)?
  • Java 语言规范详细指定了所有重载行为。 JVM 实现它。
  • @TimPote 显然是这样。根据我的经验,javac 会报告多个错误(如果存在)。在第一个之后它不会停止。我想这个已经足够致命了,可以保释了。
  • @Asaph 我打算“JVM 不会重载”。重载的方法签名必须在编译时明确选择(即使签名看起来在代码中相同,它们是两个不同的方法),因此是语言的工件.
猜你喜欢
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多