【问题标题】:Same method with different return types in abstract class and interface抽象类和接口中具有不同返回类型的相同方法
【发布时间】:2013-08-14 16:09:26
【问题描述】:

只是扩展问题..

Same method in abstract class and interface

假设一个类实现了一个接口并扩展了一个抽象类,两者都有相同的方法(名称+签名),但返回类型不同。现在,当我重写该方法时,它仅在我使返回类型与接口声明的返回类型相同时编译。

另外,如果方法在抽象类或接口中声明为 private 或 final 会发生什么?

**附注。在一次采访中,爱因斯坦先生在这个问题上坚持了很长时间。是否存在我们这样做或他只是在炫耀的流行场景?

【问题讨论】:

    标签: java inheritance interface overriding


    【解决方案1】:

    如果抽象类中的方法也是抽象的,你必须在它扩展的第一个具体类中提供它的实现。此外,您将必须提供接口的实现。如果这两种方法仅在返回类型上有所不同,则具体类将具有仅在返回类型上有所不同的重载方法。而且我们不能有仅在返回类型上有所不同的重载方法,因此会出现错误。

    interface io {
        public void show();
    }
    
    abstract class Demo {
        abstract int show();         
    }
    
    class Test extends Demo implements io {  
        void show () {     //Overloaded method based on return type, Error
        }
    
        int show() {       //Error
            return 1;
        }
    
        public static void main (String args[]) {
    
        }
    }
    

    【讨论】:

    • 精美插图。因此,我们可以安全地得出结论,如果在接口和抽象类中都声明了具有不同返回类型的相同方法,则该方法不能被覆盖。
    【解决方案2】:

    不,相同的方法名称和参数,但不同的返回类型在 Java 中是不可能的。底层 Java 类型系统无法*确定运行时对方法的调用之间的差异。

    (*我相信有人会证明我错了,但很可能解决方案无论如何都被认为是糟糕的风格。)

    关于private/final:由于必须实现这些方法,接口方法和抽象方法都不能是final。接口方法默认是公共的。抽象方法不能是私有的,因为它必须在实现类中可见,否则您永远无法实现方法实现,因为您的实现类无法“看到”该方法。

    【讨论】:

      【解决方案3】:

      默认情况下,使用接口的方法是抽象和公共的, 所以他们不能有任何其他的访问说明符,他们不能是最终的

      使用抽象类,抽象方法可以有除私有之外的任何访问说明符,因为它们是抽象的,所以不能是最终的

      重写时,方法签名必须相同;和协变(声明的返回类型的子类)返回类型是允许的

      【讨论】:

        【解决方案4】:

        一个类不能实现两个具有相同名称但返回类型不同的方法的接口。它会给出编译时错误。 默认情况下,接口内部的方法是公共抽象的,它们没有任何其他说明符。

        interface A
        {
          public void a();
        }
        interface B
        {
          public int a();
        }
        
        class C implements A,B
        {
        
          public void a() // error
         {
            //implementation
         }
        
         public int a() // error
         {
            //implementation
         }
        
         public static void main(String args[])
         {
        
         }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-03
          • 2011-10-25
          • 2015-02-05
          • 2014-11-24
          • 2023-03-25
          相关资源
          最近更新 更多