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

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

只是扩展问题..

Same method in abstract class and interface

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

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

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

java inheritance interface override
4个回答
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[]) {

    }
}

2
投票

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

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

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


1
投票

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

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

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


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

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