gpt4 book ai didi

java - 是否有可能声明并实现一次方法,但改变返回类型以以稳健的方式匹配子接口(interface)?

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

首先,我想说这没有用例。我唯一想做的就是探索这是否可能。

我想做的是将基接口(interface)中方法的返回签名“重新标记”为子接口(interface)的返回签名。

目标:声明并实现一次方法,但改变返回类型以匹配子接口(interface)。我已经想出了在某些情况下如何实现这一点,但在某些情况下它会崩溃。

想象一下,如果我有基本接口(interface) B 并且它有一个方法 B doWork()。此外,还有一个实现 doWork() 的 B 实现。由于 doWork() 的性质,这个实现应该是唯一存在的。

现在,使用泛型可以很容易地做到这一点。对于上面的例子:

interface B<T extends B> {
T doWork();
}

class BImpl<T extends B> implements B<T> {
@Override
public T doWork() { return something; }
}

子接口(interface)/impl 可能看起来像这样:

interface C extends B<C> {
void somethingCSpecific();
}

class CImpl extends BImpl<C> implements C {
@Override
public void somethingCSpecific() { }
}

任何构建 CImpl 的人都会看到 doWork() 返回一个 C。

C obj = new CImpl().doWork()  // The money shot.  No casting needed.

这就是它崩溃的地方......想象一下 B 现在看起来像这样:

public interface B<T extends B> {
T thisOrThat(T that);
boolean something();
}

我想在 BImpl 中这样做:

class BImpl<T extends B> implements B<T> {
@Override
public T thisOrThat(T that) {
if (that.something())
return that;
return this; // Error!! _this_ might be a different T than _that_.
}
@Override
public boolean something() { return whatever; }
}

注意错误发生的地方。

显然,如果没有不安全和可疑的转换,这将无法工作。但是如果我知道上面thisOrThat方法中this的实现和that的实现是一样的,就万事大吉了。

所以,对于我的问题。有没有办法在不知道先验类型的情况下将thisthat 限制为同一类型?

或者也许有不同的方法来执行此操作,但结果相同?即只需要声明和实现 thisOrThat() 一次,但返回类型适应子接口(interface)?

谢谢。

最佳答案

使您的类 BImpl 抽象并向其添加一个 view 方法,该方法由扩展您的抽象基类的特定类实现:

public abstract class BImpl<T extends B<T>> implements B<T> {
@Override
public T thisOrThat(T that) {
if (that.something())
return that;
return this.asT();
}


@Override
public boolean something() {
// TODO Auto-generated method stub
return false;
}

protected abstract T asT();
}

然后你的每个类仍然需要实现 T asT(),但这很简单并且编译时没有警告:

public class C extends BImpl<C> implements B<C> {
@Override
protected C asT() {
return this;
}
}

关于java - 是否有可能声明并实现一次方法,但改变返回类型以以稳健的方式匹配子接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10218333/

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