我们能代表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; } }