假设我有一个接口(interface) Interface
,它有一个应该返回自身的方法 aMethod()
,但也有一个默认实现。然后我还有一个类 Foo
实现了 Interface
并添加了额外的方法 aFooMethod()
。
interface Interface {
public default Interface aMethod() {
// Some code
return this;
}
}
class Foo implements Interface {
public void aFooMethod() {
// Some code
}
}
现在我不能调用 new Foo().aMethod().aFooMethod();
因为 aMethod()
返回一个 Interface
。
现在我显然可以继续并覆盖 Foo
中的方法:
class Foo implements Interface {
@Override
public Foo aMethod() {
Interface.super.aMethod();
return this;
}
public void aFooMethod() {
// Some code
}
}
我的问题是,是否有一种强制执行此操作的好方法,即子类必须返回自身而不必重写该方法?
我最好的方法是这样说:
interface Interface<I extends Interface<I>> {
@SupressWarnings("unchecked")
public default I aMethod() {
// Some code
return (I)this;
}
}
但这不是我认为的好,因为它必须使用SupressWarnings("unchecked")
。有没有更好的办法?
最佳答案
我最近问了一个关于同样的事情的问题,但是是在 C# 中。尽管问题和答案仍然相同:这样的事情是不可能的。
你提到的模式
interface Interface<I extends Interface<I>> {}
乍一看似乎是个好方法,但一旦有多个类实现了 Interface
就会分崩离析。 .问题不是抑制警告的必要性,实际上是更大的问题。如果我像这样创建两个类:
class A implements Interface<A> {}
class B implements Interface<A> {}
它仍然有效。约束 I extends Interface<I>
只强制类型参数 I
成为Interface<I>
, 和 A
是否实现 Interface<A>
,因此即使在 Interface<A>
时它也满足约束条件由 B
实现.
我一直在努力寻找解决这个问题的方法,但遗憾的是,Java 和 C# 都不允许沿着这些思路进行任何操作。
关于java - 使子类在不覆盖的情况下返回自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64823508/