class TopGene { } class MidRaw extends TopGene { } class BottomGene extends MidRaw { } class GeneType> { } class GeneUser { public void success(GeneType> p) { } public void fail(GeneType<? super BottomGene> p) { } }