我们能代表Java(或Kotlin)中的“自我”吗?
我认为问题标题有点混乱,但是我找不到更准确的方式来说这个。
我只需要一个简单的代码示例来告诉你我想要什么。
我有:
// code 1 interface A { A bla(); } class B implements A { @Override public B bla() { return this; } } class C implements A { @Override public C bla() { return this; } }
但实际上,这个代码也会编译(diff:查看返回types声明):
// code 2 interface A { A bla(); } class B implements A { @Override public A bla() { return this; } } class C implements A { @Override public A bla() { return this; } }
我想要代码2是一个types错误。
比方说,我想强制每个A
的子类的bla
方法返回自己,而不是A
我认为可以有一个虚假的代码来表示我想要的:
interface A { this.Type bla(); }
就像Haskell的types类:
class Monad (m :: * -> *) where -- here m is restricted to the subclass (>>=) :: ma -> (a -> mb) -> mb
这可能吗?
不可能,但你可以做到这一点
interface A { T bla();} class B implements A { @Override public B bla() { return this; } } class C implements A { @Override public C bla() { return this; } }