/* 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. */
class Ideone
{
{
// your code goes here
new Ideone();
}
Ideone() {
Foo<Bar> fooBar = new Foo<>(Bar.class);
Foo<Bar2> fooBar2 = new Foo<>(Bar2.class);
fooBar.say("fooBar", Bar.class);
fooBar2.say("fooBar2", Bar2.class);
Foo<Bar2> shouldFail = fooBar.fooing(Bar.class); // this should not work at compile time
Foo<? extends Bar2> shouldFail2 = fooBar.fooing(Bar.class); // this should not work at compile time
shouldFail.say("shouldFail", null);
shouldFail2.say("shouldFail2", null);
// wanted:
Foo<Bar> barFoo = fooBar2.fooing(Bar.class);
Foo<? super Bar> barFoo2 = fooBar2.fooing(Bar.class);
barFoo.say("barFoo", Bar.class);
barFoo2.say("barFoo2", Bar.class);
}
class Foo<T extends Bar> {
Class<T> myClass;
public Foo(Class<T> clazz) {
myClass = clazz;
}
public <S extends Bar> Foo<S> fooing(Class<? super T> clazz) {
return new Foo(clazz);
}
public void say
(String pre, Class
<?> expected
) { if (!myClass.equals(expected)) {
System.
out.
print("FAILURE!!! "); }
System.
out.
println("" + pre
+ " was: " + myClass.
getSimpleName() + "(expected: " + expected + ")");
}
}
class Bar {
}
class Bar2 extends Bar {
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKICAgICAgICBuZXcgSWRlb25lKCk7Cgl9CgoJSWRlb25lKCkgewogICAgICAgIEZvbzxCYXI+IGZvb0JhciA9IG5ldyBGb288PihCYXIuY2xhc3MpOwogICAgICAgIEZvbzxCYXIyPiBmb29CYXIyID0gbmV3IEZvbzw+KEJhcjIuY2xhc3MpOwogICAgICAgIGZvb0Jhci5zYXkoImZvb0JhciIsIEJhci5jbGFzcyk7CiAgICAgICAgZm9vQmFyMi5zYXkoImZvb0JhcjIiLCBCYXIyLmNsYXNzKTsKCiAgICAgICAgRm9vPEJhcjI+IHNob3VsZEZhaWwgPSBmb29CYXIuZm9vaW5nKEJhci5jbGFzcyk7ICAvLyB0aGlzIHNob3VsZCBub3Qgd29yayBhdCBjb21waWxlIHRpbWUKICAgICAgICBGb288PyBleHRlbmRzIEJhcjI+IHNob3VsZEZhaWwyID0gZm9vQmFyLmZvb2luZyhCYXIuY2xhc3MpOyAvLyB0aGlzIHNob3VsZCBub3Qgd29yayBhdCBjb21waWxlIHRpbWUKICAgICAgICBzaG91bGRGYWlsLnNheSgic2hvdWxkRmFpbCIsIG51bGwpOwogICAgICAgIHNob3VsZEZhaWwyLnNheSgic2hvdWxkRmFpbDIiLCBudWxsKTsKCiAgICAgICAgLy8gd2FudGVkOgogICAgICAgIEZvbzxCYXI+IGJhckZvbyA9IGZvb0JhcjIuZm9vaW5nKEJhci5jbGFzcyk7CiAgICAgICAgRm9vPD8gc3VwZXIgQmFyPiBiYXJGb28yID0gZm9vQmFyMi5mb29pbmcoQmFyLmNsYXNzKTsKICAgICAgICBiYXJGb28uc2F5KCJiYXJGb28iLCBCYXIuY2xhc3MpOwogICAgICAgIGJhckZvbzIuc2F5KCJiYXJGb28yIiwgQmFyLmNsYXNzKTsKCX0KCiAgICBjbGFzcyBGb288VCBleHRlbmRzIEJhcj4gewogICAgICAgIENsYXNzPFQ+IG15Q2xhc3M7CgogICAgICAgIHB1YmxpYyBGb28oQ2xhc3M8VD4gY2xhenopIHsKICAgICAgICAgICAgbXlDbGFzcyA9IGNsYXp6OwogICAgICAgIH0KCiAgICAgICAgcHVibGljIDxTIGV4dGVuZHMgQmFyPiBGb288Uz4gZm9vaW5nKENsYXNzPD8gc3VwZXIgVD4gY2xhenopIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBGb28oY2xhenopOwogICAgICAgIH0gICAgICAgIAogICAgICAgIAogICAgICAgIHB1YmxpYyB2b2lkIHNheShTdHJpbmcgcHJlLCBDbGFzczw/PiBleHBlY3RlZCkgewogICAgICAgICAgICBpZiAoIW15Q2xhc3MuZXF1YWxzKGV4cGVjdGVkKSkgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiRkFJTFVSRSEhISAiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyBwcmUgKyAiIHdhczogIiArIG15Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsKICAgICAgICAgICAgICAgICAgICAiKGV4cGVjdGVkOiAiICsgZXhwZWN0ZWQgKyAiKSIpOwogICAgICAgIH0KICAgIH0KCiAgICBjbGFzcyBCYXIgewogICAgfQoKICAgIGNsYXNzIEJhcjIgZXh0ZW5kcyBCYXIgewogICAgfQp9