import java.util.*;
import java.lang.reflect.*;
class Example {
public static void main
(String[] args
) { try {
// OK
System.
out.
println(getClassE
( new ArrayList
<String
>() {} ));
// also OK
class StringList extends ArrayList<String> {}
System.
out.
println(getClassE
( new StringList
() ));
// not OK
System.
out.
println(getClassE
( new ArrayList
<String
>() ));
e.
printStackTrace(System.
out); }
}
static <E> Class<E> getClassE(List<E> list) {
Class<?> listClass = list.getClass();
Type gSuper = listClass.getGenericSuperclass();
if(!(gSuper instanceof ParameterizedType))
ParameterizedType pType = (ParameterizedType)gSuper;
Type tArg = pType.getActualTypeArguments()[0];
if(!(tArg instanceof Class<?>))
@SuppressWarnings("unchecked")
final Class<E> classE = (Class<E>)tArg;
return classE;
}
}
CmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CgpjbGFzcyBFeGFtcGxlIHsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICB0cnkgewogICAgICAgIAkvLyBPSwogICAgICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3NFKCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSB7fSApKTsKICAgICAgICAJCiAgICAgICAgCS8vIGFsc28gT0sKICAgICAgICAJY2xhc3MgU3RyaW5nTGlzdCBleHRlbmRzIEFycmF5TGlzdDxTdHJpbmc+IHt9CiAgICAgICAgCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzc0UoIG5ldyBTdHJpbmdMaXN0KCkgKSk7CiAgICAgICAgCQogICAgICAgIAkvLyBub3QgT0sKICAgICAgICAJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzRSggbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkgKSk7CiAgICAgICAgCQogICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBzdGF0aWMgPEU+IENsYXNzPEU+IGdldENsYXNzRShMaXN0PEU+IGxpc3QpIHsKCSAgICBDbGFzczw/PiBsaXN0Q2xhc3MgPSBsaXN0LmdldENsYXNzKCk7CgkKCSAgICBUeXBlIGdTdXBlciA9IGxpc3RDbGFzcy5nZXRHZW5lcmljU3VwZXJjbGFzcygpOwoJICAgIGlmKCEoZ1N1cGVyIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpKQoJICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CgkKCSAgICBQYXJhbWV0ZXJpemVkVHlwZSBwVHlwZSA9IChQYXJhbWV0ZXJpemVkVHlwZSlnU3VwZXI7CgkKCSAgICBUeXBlIHRBcmcgPSBwVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF07CgkgICAgaWYoISh0QXJnIGluc3RhbmNlb2YgQ2xhc3M8Pz4pKQoJICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CgkKCSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKCSAgICBmaW5hbCBDbGFzczxFPiBjbGFzc0UgPSAoQ2xhc3M8RT4pdEFyZzsKCSAgICByZXR1cm4gY2xhc3NFOwoJfQp9