import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodHandles.Lookup;
import java.lang.invoke.MethodType;
class Ideone {
static class Base {
return Base.class.getSimpleName() + x.hashCode();
}
}
static class Ext extends Base {
return Ext.class.getSimpleName() + x.length();
}
}
Lookup lookup = MethodHandles.lookup();
MethodType mt
= MethodType.
methodType(Object.
class, arg.
getClass()); MethodHandle mh = lookup.findVirtual(x.getClass(), "f", mt);
return mh.invoke(x, arg);
}
Base x = new Ext();
System.
out.
println(x.
f("1")); // sucks System.
out.
println(f
(x,
"1")); // sig-polymorphic behavior }
}
aW1wb3J0IGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlOwppbXBvcnQgamF2YS5sYW5nLmludm9rZS5NZXRob2RIYW5kbGVzOwppbXBvcnQgamF2YS5sYW5nLmludm9rZS5NZXRob2RIYW5kbGVzLkxvb2t1cDsKaW1wb3J0IGphdmEubGFuZy5pbnZva2UuTWV0aG9kVHlwZTsKCmNsYXNzIElkZW9uZSB7CglzdGF0aWMgY2xhc3MgQmFzZSB7CgkJT2JqZWN0IGYoT2JqZWN0IHgpIHsKCQkJcmV0dXJuIEJhc2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgeC5oYXNoQ29kZSgpOwoJCX0KCX0KCglzdGF0aWMgY2xhc3MgRXh0IGV4dGVuZHMgQmFzZSB7CgkJT2JqZWN0IGYoU3RyaW5nIHgpIHsKCQkJcmV0dXJuIEV4dC5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyB4Lmxlbmd0aCgpOwoJCX0KCX0KCglwdWJsaWMgc3RhdGljIE9iamVjdCBmKEJhc2UgeCwgT2JqZWN0IGFyZykgdGhyb3dzIFRocm93YWJsZSB7CgkJTG9va3VwIGxvb2t1cCA9IE1ldGhvZEhhbmRsZXMubG9va3VwKCk7CgkJTWV0aG9kVHlwZSBtdCA9IE1ldGhvZFR5cGUubWV0aG9kVHlwZShPYmplY3QuY2xhc3MsIGFyZy5nZXRDbGFzcygpKTsKCQlNZXRob2RIYW5kbGUgbWggPSBsb29rdXAuZmluZFZpcnR1YWwoeC5nZXRDbGFzcygpLCAiZiIsIG10KTsKCQlyZXR1cm4gbWguaW52b2tlKHgsIGFyZyk7Cgl9CgoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7CgkJQmFzZSB4ID0gbmV3IEV4dCgpOwoJCVN5c3RlbS5vdXQucHJpbnRsbih4LmYoIjEiKSk7ICAgLy8gc3Vja3MKCQlTeXN0ZW0ub3V0LnByaW50bG4oZih4LCAiMSIpKTsgIC8vIHNpZy1wb2x5bW9ycGhpYyBiZWhhdmlvcgoJfQp9Cg==