I think the question title is a little bit confusing, but I can't find a more precise way to say this.
I just need a simple code example to tell you what I want.
I have:
// 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; } }
But actually, this code will compile too (diff: look at the return type declaration):
// 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; } }
I want code 2 to be a type error.
Say, I want to force every A's subclass' bla method to return their self, instead of an A.
I think there can be a fake code to represent what I want:
interface A { this.Type bla(); }
Just like Haskell's typeclasses:
class Monad (m :: * -> *) where
-- here m is restricted to the subclass
(>>=) :: m a -> (a -> m b) -> m b
Is this possible?
解决方案
Not possible, but you can do that
interface A { T bla();}
class B implements A { @Override public B bla() { return this; } }
class C implements A { @Override public C bla() { return this; } }