/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
{
public static Class mostDerived(Collection<?> objects) {
Optional<List<Class<?>>> mostDerived =
objects.stream()
.reduce((l1, l2) -> {
l1.retainAll(l2);
return l1;
});
return mostDerived.map(l -> l.get(0)).orElse(null);
}
private static List
<Class
<?>> getHierarchy
(Object l
) { List<Class<?>> result = new ArrayList<>();
for (Class<?> clz = l.getClass(); clz != null; clz = clz.getSuperclass()) {
result.add(clz);
}
return result;
}
public static void main
(String[] args
) { assertEquals
(A.
class,
Util.
mostDerived(Arrays.
asList(new B
(),
new B
(),
new C
(),
new A
(),
new B
()))); assertEquals
(B.
class,
Util.
mostDerived(Arrays.
asList(new C
(),
new B
(),
new C
(),
new C
(),
new B
()))); assertEquals
(A.
class,
Util.
mostDerived(Arrays.
asList(new B
(),
new D
(),
new B
()))); }
private static void assertEquals(Class<?> aClass, Class mostDerived) {
if (!aClass.equals(mostDerived)) {
}
}
}
class A {};
class B extends A {};
class C extends B {};
class D extends A {};
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgVXRpbAp7CiAgICBwdWJsaWMgc3RhdGljIENsYXNzIG1vc3REZXJpdmVkKENvbGxlY3Rpb248Pz4gb2JqZWN0cykgewogICAgICAgIE9wdGlvbmFsPExpc3Q8Q2xhc3M8Pz4+PiBtb3N0RGVyaXZlZCA9CiAgICAgICAgICAgIG9iamVjdHMuc3RyZWFtKCkKICAgICAgICAgICAgICAgICAgIC5tYXAoVXRpbDo6Z2V0SGllcmFyY2h5KQogICAgICAgICAgICAgICAgICAgLnJlZHVjZSgobDEsIGwyKSAtPiB7CiAgICAgICAgICAgICAgICAgICAgICAgbDEucmV0YWluQWxsKGwyKTsKICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbDE7CiAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbW9zdERlcml2ZWQubWFwKGwgLT4gbC5nZXQoMCkpLm9yRWxzZShudWxsKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPD8+PiBnZXRIaWVyYXJjaHkoT2JqZWN0IGwpIHsKICAgICAgICBMaXN0PENsYXNzPD8+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICBmb3IgKENsYXNzPD8+IGNseiA9IGwuZ2V0Q2xhc3MoKTsgY2x6ICE9IG51bGw7IGNseiA9IGNsei5nZXRTdXBlcmNsYXNzKCkpIHsKICAgICAgICAgICAgcmVzdWx0LmFkZChjbHopOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBhc3NlcnRFcXVhbHMoQS5jbGFzcywgVXRpbC5tb3N0RGVyaXZlZChBcnJheXMuYXNMaXN0KG5ldyBCKCksIG5ldyBCKCksIG5ldyBDKCksIG5ldyBBKCksIG5ldyBCKCkpKSk7CiAgICAgICAgYXNzZXJ0RXF1YWxzKEIuY2xhc3MsIFV0aWwubW9zdERlcml2ZWQoQXJyYXlzLmFzTGlzdChuZXcgQygpLCBuZXcgQigpLCBuZXcgQygpLCBuZXcgQygpLCBuZXcgQigpKSkpOwogICAgICAgIGFzc2VydEVxdWFscyhBLmNsYXNzLCBVdGlsLm1vc3REZXJpdmVkKEFycmF5cy5hc0xpc3QobmV3IEIoKSwgbmV3IEQoKSwgbmV3IEIoKSkpKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscyhDbGFzczw/PiBhQ2xhc3MsIENsYXNzIG1vc3REZXJpdmVkKSB7CiAgICAgICAgaWYgKCFhQ2xhc3MuZXF1YWxzKG1vc3REZXJpdmVkKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwogICAgICAgIH0KICAgIH0KfQoKCmNsYXNzIEEge307CgpjbGFzcyBCIGV4dGVuZHMgQSB7fTsKCmNsYXNzIEMgZXh0ZW5kcyBCIHt9OwoKY2xhc3MgRCBleHRlbmRzIEEge307Cg==