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

时间:2015-01-23 12:04:49

标签: java interface return-type method-overriding

我只是为了一些研究目的而学习Java。   我对Java中的接口机制有疑问。   我不知道将界面理解为某种特殊的抽象类是否正确;但我很困惑哪种方法" 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的类:

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

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

我已经查阅了Bruce Eckel的 Thinking in Java ,但没有找到任何帮助。

感谢您的时间!

4 个答案:

答案 0 :(得分:2)

只有不同的返回类型是不够的。

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

答案 1 :(得分:2)

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

  

如果返回类型为R1的方法声明d1覆盖或隐藏了另一个返回类型为R2的方法d2的声明,那么对于d2,d1必须是return-type-substitutable(第8.4.5节),或者是编译时错误发生。

Section 8.4.5解释了返回类型如何可替换:

  

具有返回类型R1的方法声明d1是 return-type-substitutable ,用于另一个方法d2,返回类型为R2 iff以下任何一个为真:

     
      
  • 如果R1为void,则R2为void

  •   
  • 如果R1是基本类型,则R2与R1相同。

  •   
  • 如果R1是引用类型,则以下之一为真:

         
        
    • R1,适用于d2(§8.4.4)的类型参数,是R2的子类型。

    •   
    • 可以通过未经检查的转换(第5.1.9节)将R1转换为R2的子类型。

    •   
    • d1与d2(§8.4.2)的签名不同,R1 = | R2 |。

    •   
  •   

因此,如果方法pr的返回类型为void,则界面B中覆盖的方法也必须返回void。如果返回类型为int,则覆盖的方法也必须返回int。对于引用类型,返回类型应为子类型或可转换为子类型:

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
}

答案 2 :(得分:0)

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

作为方法pr()[在接口B中]在接口A中实现pr(),但是返回类型根据实现方法规则不兼容

在实现方法中,返回类型应该是instanceOf操作返回true值的相同类型或任何类型。(协变类型)

此外,2种方法只能在以下条件下区分

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

希望这有帮助!

祝你好运!

答案 3 :(得分:0)

你不能写两个相同的方法,只改变同一类中的返回类型。

方法重载具有不包含的不同规则返回类型(重载方法可以具有不同数量的参数参数类型和参数顺序< /强>)

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