gpt4 book ai didi

java - 强制调用专用方法

转载 作者:行者123 更新时间:2023-11-30 02:57:13 24 4
gpt4 key购买 nike

今天我们在工作中遇到了一个有趣的极端案例,涉及 Java 中的方法调用。想象一下以下情况:

class Bar {}

class ExtendedBar extends Bar {}

class Foo {
void doFoo(Bar bar) {}
}

class ExtendedFoo extends Foo {
void doFoo(ExtendedBar exBar) {}
}

现在您有一个 ExtendedBar 实例,并且您想要在 ExtendedFoo 实例上调用 doFoo()。在我们的测试中,运行时选择了 FoodoFoo(Bar) 实现,而不是 ExtendedFoo 中的 doFoo(ExtendedBar)

当然,有一个简单的方法可以解决这个问题 - 我们只需要将 doFoo 重命名为其他名称 - 但仍然让我们感到震惊的是,如果不重命名方法就可以以某种方式实现这一点,以保持该方法的名称,因为它在此处的强传统上下文中使用。

最佳答案

我认为没有办法直接做到这一点,因为您不是覆盖该方法,而是对其进行着色。您可以通过在其上添加 @Override 轻松断言。请注意,如果您使用返回类型执行此操作,它将正常工作:

class Foo {
Bar doFoo() { return null; }
}

class ExtendedFoo extends Foo {
@Override
ExtendedBar doFoo() { return null; }
}

但只要改变参数,就是不同的签名

我想在这种情况下你可以做的就是使用通用性。

class Foo<BAR extends Bar> {
void doFoo(BAR bar) {}
}

class ExtendedFoo extends Foo<ExtendedBar> {
@Override
void doFoo(ExtendedBar exBar) {}
}

现在,由于您实际上并正确地重写了该方法,JRE 将正确解析该方法调用并调用专门的方法。

关于java - 强制调用专用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36889526/

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