package spoon.test.generics.testclasses; public class CelebrationLunch<K,L,M> extends Lunch<M,K> { public class WeddingLunch<X> extends CelebrationLunch<Tacos, Paella, X> { class Section<Y> { <S> void reserve(S section) {} } @Override <C> void eatMe(X paramA, Tacos paramB, C paramC){} } public class WeddingLunch2<X> { class Section<Y> { <S> void reserve(S section) {} } } @Override <C> void eatMe(M paramA, K paramB, C paramC){} <R> void prepare(R cook) { } void celebrate() { CelebrationLunch<Integer,Long,Double> cl = new CelebrationLunch<>(); CelebrationLunch<Integer,Long,Double>.WeddingLunch<Mole> disgust = cl.new WeddingLunch<>(); disgust.<Tacos>prepare(new Tacos()); CelebrationLunch<Integer,Long,Double>.WeddingLunch<Mole>.Section<Paella> section = disgust.new Section<>(); section.<Tacos>reserve(null); } } class SubCelebrationLunch<K2,L2,M2> extends CelebrationLunch<K2,L2,M2> { public class SubWeddingLunch<X2> extends WeddingLunch2<X2> {} } class SubSubCelebrationLunch<K2,L2,M2> extends SubCelebrationLunch<K2,L2,M2> { public class SubSubWeddingLunch<X2> extends SubWeddingLunch<X2> { class SubSection<Y2> extends Section<Y2> { } } }