class TopGene<T> { } class MidRaw extends TopGene { } class BottomGene<T> extends MidRaw { } class GeneType<T extends TopGene<String>> { } class GeneUser { public void success(GeneType<? extends BottomGene<String>> p) { } public void fail(GeneType<<error descr="Type parameter '? super BottomGene<String>' is not within its bound; should extend 'TopGene<java.lang.String>'">? super BottomGene<String></error>> p) { } }