为什么接口类型的Java方法无法识别这个重载方法?

问题描述 投票:0回答:1

我正在备考,遇到以下问题:

IntfX 是 A 包中的接口,包含方法 public void op_a(Double e)

CIsY 是 A 包中的一个类,它实现了 IntfX 并重写了 op_a。

在包 B 中,Main 类导入包 A,扩展 CIsY 并继续将 op_a 重载为 public void op_a(Double e, Double f)

现在在 psvm 块中,有两个实例化:Intfx a = new Main() 和 Main b = new Main()

接着调用 a.op_a(Double e, Double f) 和 c.op_a(Double e, Double f)

a.op_a 调用失败。它显示编译时错误“期望 1 个参数,但发现 2 个”

我的问题是:为什么 a 对象无法使用带有 2 个参数的重载方法 op_a ?在另一个问题中,当一个方法有两个版本时,jvm 会优先考虑对象,而不是类型。

代码:

`套餐A:

public interface IntfX {
        public void op_a(Double a);
        public void op_b(Double b);
    }

public class CIsY implements IntfX {
    protected double v = 0.0;
    String p = null;

    public CIsY(Double x, String b) {
        v = x;
        p = b;
    }

    public void op_a(Double a) {
        v += a;
    }

    public void op_b(Double b) {
        v -= b;
    }

    public void op_c() {
        v = 0.0;
        p = null;
    }
}

套餐B:

import pack_a.*;

public class Main extends CIsY{
    public static void main(String[] args) {
        IntfX a = new Main();
        CIsY b = new Main();
        Men c = new Main();

        c.op_a(0.5,0.8);
        a.op_a(0.0, 0.1);
    }
    public Main() {
        super(0.0, "");
    }

    public void op_a(Double e, Double f) {
        v = e + f;
    }

    public void  op_b(Double e, Double f) {
        v = e + f;
    }

    public void op_K(Double d) {
        v = d;
    }
}

我希望a.op_a能够识别重载方法并编译。

java
1个回答
0
投票

因为接口的目的是强制执行指定方法,而 Main 类中没有这样做。

在您的示例中,您的接口 IntfX 明确指出:

  • 您必须有两个名为“op_a”和“op_b”的方法。
  • 这两种方法都必须返回 void。
  • 这两种方法都必须接受一个 Double 类型的参数,变量名称分别为“a”和“b”。

https://docs.oracle.com/javase/tutorial/java/concepts/interface.html

Java 允许重载方法,简单地说,这意味着对象内实现的每个方法必须至少以以下两种方式之一是唯一的:

  1. 方法的名称是唯一的
  2. 该方法的参数列表是唯一的

这意味着当您“重载一个方法”时,您实际上只是创建一个恰好具有相同名称的新的单独方法。很简单,Java 的编译器足够聪明,能够识别出它们是不同的方法,并 DISPITE 具有相同名称的方法。

https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

© www.soinside.com 2019 - 2024. All rights reserved.