我可以在不同的接口中为不同的方法使用相同的名称吗?

Can I use the same name for different methods in different interface?

我只是为了一些研究目的而学习 Java。 我对Java中的接口机制有疑问。 我不知道将接口理解为某种特殊的抽象是否正确class;但我很困惑"pr(int _i)"编译时使用的是哪种方法:

public interface A {
    int flagA=0;
    void pr(int _i);
}

另一个接口 B 是这样的:

public interface B extends A{
    int flagB=0;
    double pr(int _i);
}

然后我用接口A和B实现了一个class:

public class inter1 implements A,B {
    void pr(int _i){...};
    double pr(int _i){...};
}

无法正确编译。当我使用接口 B 时,这里不会形成对接口 A 的覆盖。但是 return 类型是否足以区分两种方法?

我已经在 Java 中查阅了 Bruce Eckel 的 Thinking,但没有找到任何有用的信息。

感谢您的宝贵时间!

只有不同的 return 类型是不够的。

这是因为编译器不知道调用哪个方法。如果丢弃任何 return 值,则尤其如此。

你定义的接口B也会出现编译错误,

as method pr()[in interface B] 在 interface A 中实现 pr() ,但是 return type won't be compatible according to Implementing method rules

在实现方法中,return 类型应该是相同的类型,或者是 instanceOf 操作 return 为真值的任何类型。(协变类型)

另外2种方法只有在以下条件下才能区分

  • 参数个数
  • 参数类型
  • 这些参数的顺序

希望对您有所帮助!

祝你好运!

您不能编写两个相同的方法,仅在 return 类型中进行更改,输入相同的 class。

方法重载具有不包含的独特规则 return 类型(重载方法 可以有 不同数量的参数 , 参数类型和参数顺序)

而且您的界面也不会被编译,因为它没有以正确的方式覆盖方法。 共变类型仅适用于方法覆盖而不适用于方法重载.

Java 语言规范 section on Requirements in Overriding and Hiding 解释了重写方法时 return 类型应该如何关联:

If a method declaration d1 with return type R1 overrides or hides the declaration of another method d2 with return type R2, then d1 must be return-type-substitutable (§8.4.5) for d2, or a compile-time error occurs.

Section 8.4.5 解释了 return 类型如何可以替换:

A method declaration d1 with return type R1 is return-type-substitutable for another method d2 with return type R2 iff any of the following is true:

  • If R1 is void then R2 is void.

  • If R1 is a primitive type then R2 is identical to R1.

  • If R1 is a reference type then one of the following is true:

    • R1, adapted to the type parameters of d2 (§8.4.4), is a subtype of R2.

    • R1 can be converted to a subtype of R2 by unchecked conversion (§5.1.9).

    • d1 does not have the same signature as d2 (§8.4.2), and R1 = |R2|.

因此,如果方法 pr 的 return 类型是 void,接口 B 中的重写类型也必须 return 一个 void。如果 return 类型是 int,覆盖的方法也必须 return 和 int。对于引用类型,return 类型应该是子类型或可转换为子类型:

interface A {
   int flagA = 0;

   Number pr(int _i);
}

interface B extends A {
   int flagB = 0;

   Integer pr(int _i);  // compiles fine
}

另一方面,

interface A {
   int flagA = 0;

   Integer pr(int _i);
}

interface B extends A {
   int flagB = 0;

   Number pr(int _i);  // does not compile
}