import java.util.*;
class Builder<T extends Builder> {
private List<String> friends;
this.name = name;
return (T) this;
}
T setFriends(List<String> friends) {
this.friends = friends;
return (T) this;
}
T uncheckedOops() {
// setName returns a raw type Builder
setName("Foobar")
// oops, passing List<Integer> to List<String> compiles,
// because the parameter type of T.setFriends is erased to just List
.
setFriends(Arrays.
asList(1,
2,
3)); return (T) this;
}
public static void main
(String[] args
) { Builder<?> b = new Builder<>().uncheckedOops();
try {
for (String friend
: b.
friends) x.
printStackTrace(System.
out); }
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKY2xhc3MgQnVpbGRlcjxUIGV4dGVuZHMgQnVpbGRlcj4gewogICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGZyaWVuZHM7CiAgICAKICAgIFQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewogICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgcmV0dXJuIChUKSB0aGlzOwogICAgfQogICAgCiAgICBUIHNldEZyaWVuZHMoTGlzdDxTdHJpbmc+IGZyaWVuZHMpIHsKICAgICAgICB0aGlzLmZyaWVuZHMgPSBmcmllbmRzOwogICAgICAgIHJldHVybiAoVCkgdGhpczsKICAgIH0KICAgIAogICAgVCB1bmNoZWNrZWRPb3BzKCkgewogICAgICAgIC8vIHNldE5hbWUgcmV0dXJucyBhIHJhdyB0eXBlIEJ1aWxkZXIKICAgICAgICBzZXROYW1lKCJGb29iYXIiKQogICAgICAgICAgICAvLyBvb3BzLCBwYXNzaW5nIExpc3Q8SW50ZWdlcj4gdG8gTGlzdDxTdHJpbmc+IGNvbXBpbGVzLAogICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBwYXJhbWV0ZXIgdHlwZSBvZiBULnNldEZyaWVuZHMgaXMgZXJhc2VkIHRvIGp1c3QgTGlzdAogICAgICAgICAgICAuc2V0RnJpZW5kcyhBcnJheXMuYXNMaXN0KDEsIDIsIDMpKTsKICAgICAgICByZXR1cm4gKFQpIHRoaXM7CiAgICB9CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBCdWlsZGVyPD8+IGIgPSBuZXcgQnVpbGRlcjw+KCkudW5jaGVja2VkT29wcygpOwogICAgICAgIAogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGZvciAoU3RyaW5nIGZyaWVuZCA6IGIuZnJpZW5kcykKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmcmllbmQpOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CiAgICAgICAgICAgIHgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwogICAgICAgIH0KICAgIH0KfQ==