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