class StopSelfRecursion {
// base class
static class Class1<Self extends Class1<Self,T>, T> {
public Self getMyself() {
return (Self) this;
}
}
// derived 1
static class Class2<Self extends Class2<Self, T>, T> extends Class1<Self, T> {
}
// derived 2
static class Class3<Self extends Class2<Self, T>, T> extends Class2<Self, T> {
}
// want to stop recursion; want Class4 has only one parameter
static class Class4<T> extends Class3<Class4<T>, T> {
}
public static void main
(String[] args
) {
Class1<?, Integer> v1 = new Class1<>();
Class2<?, Integer> v2 = new Class2<>();
Class3<?, Integer> v3 = new Class3<>();
System.
out.
println(v1.
toString()); System.
out.
println(v2.
toString()); System.
out.
println(v3.
toString());
}
}
Y2xhc3MgU3RvcFNlbGZSZWN1cnNpb24gewoKICAgLy8gYmFzZSBjbGFzcwogICBzdGF0aWMgY2xhc3MgQ2xhc3MxPFNlbGYgZXh0ZW5kcyBDbGFzczE8U2VsZixUPiwgVD4gewogICAgICBwdWJsaWMgU2VsZiBnZXRNeXNlbGYoKSB7CiAgICAgICAgIHJldHVybiAoU2VsZikgdGhpczsKICAgICAgfQogICB9CgogICAvLyBkZXJpdmVkIDEKICAgc3RhdGljIGNsYXNzIENsYXNzMjxTZWxmIGV4dGVuZHMgQ2xhc3MyPFNlbGYsIFQ+LCBUPiBleHRlbmRzIENsYXNzMTxTZWxmLCBUPiB7CiAgIH0KCiAgIC8vIGRlcml2ZWQgMgogICBzdGF0aWMgY2xhc3MgQ2xhc3MzPFNlbGYgZXh0ZW5kcyBDbGFzczI8U2VsZiwgVD4sIFQ+IGV4dGVuZHMgQ2xhc3MyPFNlbGYsIFQ+IHsKICAgfQoKICAgLy8gd2FudCB0byBzdG9wIHJlY3Vyc2lvbjsgd2FudCBDbGFzczQgaGFzIG9ubHkgb25lIHBhcmFtZXRlcgogICBzdGF0aWMgY2xhc3MgQ2xhc3M0PFQ+IGV4dGVuZHMgQ2xhc3MzPENsYXNzNDxUPiwgVD4gewogICB9CgogICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgogICAgICBDbGFzczE8PywgSW50ZWdlcj4gdjEgPSBuZXcgQ2xhc3MxPD4oKTsKCiAgICAgIENsYXNzMjw/LCBJbnRlZ2VyPiB2MiA9IG5ldyBDbGFzczI8PigpOwoKICAgICAgQ2xhc3MzPD8sIEludGVnZXI+IHYzID0gbmV3IENsYXNzMzw+KCk7CgogICAgICBTeXN0ZW0ub3V0LnByaW50bG4odjEudG9TdHJpbmcoKSk7CiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih2Mi50b1N0cmluZygpKTsKICAgICAgU3lzdGVtLm91dC5wcmludGxuKHYzLnRvU3RyaW5nKCkpOwoKCiAgIH0KfQ==