当前位置: 首页 > 知识库问答 >
问题:

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

季森
2023-03-14

只是延伸问题...

抽象类和接口中的相同方法

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

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

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

共有3个答案

宣原
2023-03-14

对于接口,默认情况下这些方法是抽象的和公共的,因此它们不能有任何其他访问说明符,也不能是最终的

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

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

鲁阳焱
2023-03-14

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

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

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

金英华
2023-03-14

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

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

    }
}
 类似资料:
  • 问题内容: 我发现情况: 问题答案: 您同时满足这两个条件;即。一种实现是同时满足抽象类要求和接口要求。 注意,除非在另一个继承链中使用,否则不需要它。另外,将其移至抽象类定义可能很有意义。

  • 我正在尝试实现和重写具有不同返回类型的方法,而不会被迫转换返回类型。 我的问题:是否可以在不强制强制转换的情况下返回不同的类型?解决这个问题的抽象方法看起来怎么样? 我认为必须有一个解决方案,因为编译器应该知道返回类型...

  • 想象一下,我有一个抽象类动物的方法: 然后我有一个类,用以下内容扩展这个抽象类: 我希望每个扩展Animal的类都有一个fetch()方法。然而,fetch方法为相关动物指定了一些独特的特征(狗的爪子、猫的爪子等)。例如,cat的fetch()将获取参数fetch(fellinecat kitty)并表示: 因此,抓取方法接受了扩展抽象类“动物”(因此是动物)的参数。我在“动物”中定义了抓取()方

  • 我说的是Java,但这个概念也适用于其他语言-- 我们在同一个类上有两个方法,它们具有相同的基本功能,但提供不同的返回类型。这两种方法都会给你所有的东西,但一个得到一个可以提供对所有东西的访问的可迭代的,一个得到一个包含所有东西的集合。 我们知道你不能这样做(因为它不会编译): 那么,有人想过如何命名这些方法吗?这似乎是一个简单的解决方法: 然而,这显然有些冗长,可能不是最好的解决方案。我问的这个

  • 在那里,我被告知接口和抽象类除了方法签名(名称、参数)和返回类型之外没有实现/方法体,所以通常我们写: 然而,我想知道我们能不能这样写: 因为它表明,当我们创建接口或抽象类时,返回类型可以在方法中

  • 问题内容: 以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法: 在控制台中显示所需的输出: 现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数: 我什至无法编译程序: 问 :为什么 当 方法具有相同的名称和Arity 时 ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型? 问题答案: 因为Go不支持在其参数类型上重载用户定