import java.util.*;
import java.lang.*;
import java.io.*;
import java.lang.reflect.ParameterizedType;
abstract class Mumble<T> {
public abstract Mumble<Integer> getInstance();
protected T something;
@SuppressWarnings("unchecked")
public Mumble
<Integer
> reflectInstance
() throws Exception { Class<? extends Mumble> clazz = getClass();
// Dirty implicit unchecked cast
Mumble<Integer> obj = clazz.newInstance();
obj.something = 20;
return obj;
}
@SuppressWarnings("unchecked")
// Dirty
Mumble<Integer> obj = (Mumble<Integer>) this;
System.
out.
println("this class = " + obj.
getClass().
getName()); // Mumble.something can hold any Object, this is why it is dirty
// something should be an Integer right? Wrong.
System.
out.
println("\tobj.something = " + obj.
something); obj = getInstance();
System.
out.
println("getInstance() class = " + obj.
getClass().
getName()); System.
out.
println("\tobj.something = " + obj.
something); obj = reflectInstance();
System.
out.
println("reflectInstance() class = " + obj.
getClass().
getName()); System.
out.
println("\tobj.something = " + obj.
something);
}
}
class Bumble<T> extends Mumble<T> {
@Override
public Mumble<Integer> getInstance() {
Bumble b = new Bumble<Integer>();
b.something = 10;
return b;
}
}
class Ideone{
Bumble<String> bumble = new Bumble<String>();
bumble.something = "I'm a String";
bumble.selfTest();
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKCmFic3RyYWN0IGNsYXNzIE11bWJsZTxUPiB7CglwdWJsaWMgYWJzdHJhY3QgTXVtYmxlPEludGVnZXI+IGdldEluc3RhbmNlKCk7CgkKCXByb3RlY3RlZCBUIHNvbWV0aGluZzsKCQoJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCglwdWJsaWMgTXVtYmxlPEludGVnZXI+IHJlZmxlY3RJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewoJCUNsYXNzPD8gZXh0ZW5kcyBNdW1ibGU+IGNsYXp6ID0gZ2V0Q2xhc3MoKTsKCQkvLyBEaXJ0eSBpbXBsaWNpdCB1bmNoZWNrZWQgY2FzdAoJCU11bWJsZTxJbnRlZ2VyPiBvYmogPSBjbGF6ei5uZXdJbnN0YW5jZSgpOwoJCW9iai5zb21ldGhpbmcgPSAyMDsKCQkKCQlyZXR1cm4gb2JqOwoJfQoJCglAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgIHB1YmxpYyB2b2lkIHNlbGZUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAJIC8vIERpcnR5CiAgICAgICAgIE11bWJsZTxJbnRlZ2VyPiBvYmogPSAgKE11bWJsZTxJbnRlZ2VyPikgdGhpczsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0aGlzIGNsYXNzID0gIiArIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSk7IAogICAgICAgICAvLyBNdW1ibGUuc29tZXRoaW5nIGNhbiBob2xkIGFueSBPYmplY3QsIHRoaXMgaXMgd2h5IGl0IGlzIGRpcnR5CiAgICAgICAgIC8vIHNvbWV0aGluZyBzaG91bGQgYmUgYW4gSW50ZWdlciByaWdodD8gV3JvbmcuCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRvYmouc29tZXRoaW5nID0gIiArIG9iai5zb21ldGhpbmcpOwogICAgICAgICBvYmogPSBnZXRJbnN0YW5jZSgpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldEluc3RhbmNlKCkgY2xhc3MgPSAiICsgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdG9iai5zb21ldGhpbmcgPSAiICsgb2JqLnNvbWV0aGluZyk7CiAgICAgICAgIG9iaiA9IHJlZmxlY3RJbnN0YW5jZSgpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlZmxlY3RJbnN0YW5jZSgpIGNsYXNzID0gIiArIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRvYmouc29tZXRoaW5nID0gIiArIG9iai5zb21ldGhpbmcpOwogICAgICAgICAKICAgIH0KfSAKY2xhc3MgQnVtYmxlPFQ+IGV4dGVuZHMgTXVtYmxlPFQ+IHsKICAgIEBPdmVycmlkZQogICAgcHVibGljIE11bWJsZTxJbnRlZ2VyPiBnZXRJbnN0YW5jZSgpIHsKICAgIAlCdW1ibGUgYiA9IG5ldyBCdW1ibGU8SW50ZWdlcj4oKTsKICAgIAliLnNvbWV0aGluZyA9IDEwOwogICAgCXJldHVybiBiOwogICAgfQp9CgoKY2xhc3MgSWRlb25lewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKCQlCdW1ibGU8U3RyaW5nPiBidW1ibGUgPSBuZXcgQnVtYmxlPFN0cmluZz4oKTsKCQlidW1ibGUuc29tZXRoaW5nID0gIkknbSBhIFN0cmluZyI7CgkJYnVtYmxlLnNlbGZUZXN0KCk7Cgl9Cn0=