class Ideone {
public static void main
(String[] args
) { boo(Bar.bar1);
// foo(new Baz()); // should not work - does not work
// foo(Bang.bang1); // should not work - does not work
}
public static <T extends Enum<T> & Foo<Integer>> void boo(T t) {
System.
out.
println(t.
ordinal()); }
}
interface Foo<T> {
T foo();
}
enum Bar implements Foo<Integer> {
bar1(1);
final int foo;
Bar(int foo) {
this.foo = foo;
}
@Override
return foo;
}
}
class Baz implements Foo<Integer> {
@Override
return 42;
}
}
enum Bang {
bang1
}
Y2xhc3MgSWRlb25lIHsKICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICBib28oQmFyLmJhcjEpOwovLyAgICBmb28obmV3IEJheigpKTsgLy8gc2hvdWxkIG5vdCB3b3JrIC0gZG9lcyBub3Qgd29yawovLyAgICBmb28oQmFuZy5iYW5nMSk7IC8vIHNob3VsZCBub3Qgd29yayAtIGRvZXMgbm90IHdvcmsKICB9CgogIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBFbnVtPFQ+ICYgRm9vPEludGVnZXI+PiB2b2lkIGJvbyhUIHQpIHsKICAgIFN5c3RlbS5vdXQucHJpbnRsbih0Lm9yZGluYWwoKSk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4odC5mb28oKSk7CiAgfQp9CgppbnRlcmZhY2UgRm9vPFQ+IHsKICBUIGZvbygpOwp9CgplbnVtIEJhciBpbXBsZW1lbnRzIEZvbzxJbnRlZ2VyPiB7CiAgYmFyMSgxKTsKCiAgZmluYWwgaW50IGZvbzsKCiAgQmFyKGludCBmb28pIHsKICAgIHRoaXMuZm9vID0gZm9vOwogIH0KCiAgQE92ZXJyaWRlCiAgcHVibGljIEludGVnZXIgZm9vKCkgewogICAgcmV0dXJuIGZvbzsKICB9Cn0KCmNsYXNzIEJheiBpbXBsZW1lbnRzIEZvbzxJbnRlZ2VyPiB7CiAgQE92ZXJyaWRlCiAgcHVibGljIEludGVnZXIgZm9vKCkgewogICAgcmV0dXJuIDQyOwogIH0KfQoKZW51bSBCYW5nIHsKICBiYW5nMQp9