2017-12-18 219 views
1

我認爲問題標題有點混亂,但我找不到更準確的說法。
我只需要一個簡單的代碼示例來告訴你我想要什麼。我們可以代表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:看的返回類型聲明):

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

這可能嗎?

+0

不可能在Java中,不知道科特林。 – Oleg

+0

噢不,壞消息TAT @Oleg – ice1000

+0

@ ice1000我已經使用過這個庫,我想這是你要找的:https://github.com/h0tk3y/kotlin-monads;) –

回答

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; } } 
+0

啊,非常感謝! PRPR – ice1000

相關問題