class Foo { abstract static class Animal> { abstract A copyAnimal(A animal); } static class Duck> extends Animal { void quack() {} D copyAnimal(D duck) { duck.quack(); return duck; } } static class Mallard extends Duck { Mallard copyAnimal(Mallard duck) { duck.quack(); return duck; } } public static void main(String[] args) {} }