抽象类和接口中具有不同返回类型的相同方法

时间:2013-08-13 06:46:41

标签: java inheritance interface override

只是扩展问题..

Same method in abstract class and interface

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

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

**旁注。爱因斯坦先生在接受采访时坚持这个问题的时间非常长。有没有一个流行的场景,我们这样做或他只是炫耀?

4 个答案:

答案 0 :(得分:2)

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

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[]) {

    }
}

答案 1 :(得分:2)

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

(*我相信有人会证明我错了,但最有可能的解决方案被认为是不好的风格。)

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

答案 2 :(得分:1)

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

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

在覆盖时,方法签名必须相同;和covariant(声明的返回类型的子类)允许返回类型

答案 3 :(得分:1)

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

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[])
 {

 }
}