In Java, you can narrow the return type in override methods.
But is this narrowing possible during the announcement?
For example, this may be good in a template where the inner class is subclassed simultaneously with the outer one:
public class Try_ForceNarrow {
public interface IMember {
}
public interface Container<M extends IMember> {
M createMember();
}
public static class A implements Container<A.Member> {
@Override
public Member createMember() {
return new Member();
}
public class Member implements IMember {
}
}
public static class B extends A implements Container<B.Member> {
@Override
public Member createMember() {
return new Member();
}
public class Member extends A.Member {
}
}
public static void main(String[] args) {
}
}
This code was not compiled with the error "The interface container cannot be implemented several times with different arguments."
How to avoid this?
Of course I can just write
public static class B extends A {
@Override
public Member createMember() {
return new Member();
}
public class Member extends A.Member {
}
}
But in this way I can forget to override createMember()and break the pattern.
source
share