This program does not compile (jdk8 build 106) public class Tmp { class S{} interface I<S, T extends S>{} class C implements I<C,C>{} } Apparently, javac thinks the bound of T is the class S, not the type variable S. I'm not sure if this is correct - shouldn't type variable S shadow class S inside <>? Thanks, Zhong Yu