1

我认为问题标题有点令人困惑,但我找不到更准确的说法。
我只需要一个简单的代码示例来告诉你我想要什么。

我有:

// 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; } }

但实际上,这段代码也会编译(差异:查看返回类型声明):

// 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 是类型错误。
说,我想强制每个A“子类”bla方法返回自己,而不是A.

我认为可以有一个假代码来代表我想要的:

interface A { this.Type bla(); }

就像 Haskell 的类型类:

class Monad (m :: * -> *) where
  -- here m is restricted to the subclass
  (>>=) :: m a -> (a -> m b) -> m b

这可能吗?

4

1 回答 1

3

不可能,但你可以这样做

interface A<T extends A> { T bla();}
class B implements A<B> { @Override public B bla() { return this; } }
class C implements A<C> { @Override public C bla() { return this; } }
于 2017-12-18T03:24:32.750 回答