gpt4 book ai didi

java - 扩展接口(interface)更改方法签名

转载 作者:行者123 更新时间:2023-11-30 02:56:12 25 4
gpt4 key购买 nike

考虑以下接口(interface)

interface Foo1
{
public function foo(BaseClass)
}

interface Foo2
{
public function foo(SpecialClass)
}

其中SpecialClass继承自BaseClass

现在,只要需要 Foo2 实例,就可以使用 Foo1 实例。我的意思是,如果我需要一个具有接受 SpecialClassfoo 方法的对象,我可以使用具有 foo 方法的对象来完成这项工作接受BaseClass

因此,我希望能够将 Foo1 声明为 Foo2 的子类(即 Foo1 扩展 Foo2)。

PHP(我通常使用的语言)中这是不可能的,并且会产生 fatal error 。

据我所知,这在 Java 中是可行的,但需要实现一个特定的 foo 方法,以特殊的类作为参数(我在这一点上错了吗?)。

这一切有意义还是我错过了什么?有没有其他面向对象的语言可以提供开箱即用的功能?

最佳答案

在java语法中,接口(interface)应声明如下:

interface Foo2
{
public void foo(SpecialClass b);
}

interface Foo1 extends Foo2
{
public void foo(BaseClass s); // In Java doesn't inherits from Foo2.foo!
}

从继承的角度来看,上述脚本理论上是正确的。不幸的是,Java 没有以预期的方式解释它:Foo1.fooFoo2.foo 被视为两个不同的重载函数。

Java 按预期方式接受和解释的唯一声明如下:

interface Foo2
{
public void foo(BaseClass b);
}

interface Foo1 extends Foo2
{
public void foo(BaseClass b);
}

然后你可以在自己的实现中编写如下内容:

class Foo1Class implements Foo1
{
public void foo(BaseClass b)
{
if(!(b instanceof SpecialClass)) throw new ClassCastException();

...
}
}

关于java - 扩展接口(interface)更改方法签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37157534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com