How do I enforce that the method getFoo() in the implementing class, returns a list of the type of same implementing class.
public interface Bar{ ....
You should infer the generic on Bar:
Bar
public interface Bar { ... List getFoo(); }
You can just parameterize the method, but that will not ensure that the return type matches that of the class.