import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
class Covariance {
public static void main
(String[] args
) { X x = new X();
x.getChildren().add(new Y());
x.getChildren().add(new Y());
Test test = new Test();
test.methodTest(x);
}
public static abstract class Data {
public abstract Collection<? extends Data> getChildren();
}
public static class Y extends Data {
private static AtomicInteger idGen = new AtomicInteger();
public final int id = idGen.getAndIncrement();
public Collection<? extends Data> getChildren() {
return null;
}
@Override
return String.
format("Y [id=%s]", id
); }
}
public static class X extends Data {
public final Collection<Y> ys = new ArrayList<>();
public Collection<Y> getChildren() {
return ys;
}
}
public static class Test {
public void methodTest(X someX) {
for (Y y : someX.getChildren()) { //NOPE: type mismatch
}
}
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CgpjbGFzcyBDb3ZhcmlhbmNlIHsKICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICBYIHggPSBuZXcgWCgpOwogICAgeC5nZXRDaGlsZHJlbigpLmFkZChuZXcgWSgpKTsKICAgIHguZ2V0Q2hpbGRyZW4oKS5hZGQobmV3IFkoKSk7CiAgICBUZXN0IHRlc3QgPSBuZXcgVGVzdCgpOwogICAgdGVzdC5tZXRob2RUZXN0KHgpOwogIH0KICAKICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIERhdGEgewogICAgcHVibGljIGFic3RyYWN0IENvbGxlY3Rpb248PyBleHRlbmRzIERhdGE+IGdldENoaWxkcmVuKCk7CiAgfQoKICBwdWJsaWMgc3RhdGljIGNsYXNzIFkgZXh0ZW5kcyBEYXRhIHsKICAgIHByaXZhdGUgc3RhdGljIEF0b21pY0ludGVnZXIgaWRHZW4gPSBuZXcgQXRvbWljSW50ZWdlcigpOwogICAgCiAgICBwdWJsaWMgZmluYWwgaW50IGlkID0gaWRHZW4uZ2V0QW5kSW5jcmVtZW50KCk7IAogICAgCiAgICBwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGF0YT4gZ2V0Q2hpbGRyZW4oKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlkgW2lkPSVzXSIsIGlkKTsKICAgIH0KICB9CgogIHB1YmxpYyBzdGF0aWMgY2xhc3MgWCBleHRlbmRzIERhdGEgewogICAgcHVibGljIGZpbmFsIENvbGxlY3Rpb248WT4geXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgIAogICAgcHVibGljIENvbGxlY3Rpb248WT4gZ2V0Q2hpbGRyZW4oKSB7CiAgICAgIHJldHVybiB5czsKICAgIH0KICB9CgogIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdCB7CiAgICBwdWJsaWMgdm9pZCBtZXRob2RUZXN0KFggc29tZVgpIHsKICAgICAgZm9yIChZIHkgOiBzb21lWC5nZXRDaGlsZHJlbigpKSB7IC8vTk9QRTogdHlwZSBtaXNtYXRjaAogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih5KTsKICAgICAgfQogICAgfQogIH0KfQ==