import java.util.* ;
import java.lang.* ;
import java.io.* ;
class Ideone
{
// These 3 choices are the only type-safe things we can do
private static < T> Map< T, List< T>> getStuff( ) {
// return new HashMap<>();
// return null;
Map< T, List< T>> map = new HashMap<> ( ) ;
map.put ( null , null ) ;
return map;
}
// If we want a non-empty map, we have to cast it. But then we can't guarantee it matches
// the type that was inferred
private static < T> Map< T, List< T>> getStuffBad( ) {
return ( Map< T, List< T>> ) map;
}
// The same getStuff() call works regardless of whether we want strings or integers
// The only way this is provable type safe is an empty map or null.
Map
< String , List
< String
>> strMap
= getStuff
( ) ; Map
< Integer , List
< Integer
>> intMap
= getStuff
( ) ;
// We ask for an int map, which is allowed
Map
< Integer , List
< Integer
>> badIntMap
= getStuffBad
( ) ; try {
for ( Integer i
: badIntMap.
keySet ( ) ) { // But it has a string in it, which throws when we access a non-string method
i.intValue ( ) ;
}
}
System .
out .
println ( e.
getMessage ( ) ) ; }
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBJZGVvbmUKewogICAgLy8gVGhlc2UgMyBjaG9pY2VzIGFyZSB0aGUgb25seSB0eXBlLXNhZmUgdGhpbmdzIHdlIGNhbiBkbwogICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IE1hcDxULCBMaXN0PFQ+PiBnZXRTdHVmZigpIHsKICAgICAgICAvLyByZXR1cm4gbmV3IEhhc2hNYXA8PigpOwogICAgICAgIAogICAgICAgIC8vIHJldHVybiBudWxsOwogICAgICAgIAogICAgICAgIE1hcDxULCBMaXN0PFQ+PiBtYXAgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgbWFwLnB1dChudWxsLCBudWxsKTsKICAgICAgICByZXR1cm4gbWFwOwogICAgfQoKICAgIC8vIElmIHdlIHdhbnQgYSBub24tZW1wdHkgbWFwLCB3ZSBoYXZlIHRvIGNhc3QgaXQuIEJ1dCB0aGVuIHdlIGNhbid0IGd1YXJhbnRlZSBpdCBtYXRjaGVzCiAgICAvLyB0aGUgdHlwZSB0aGF0IHdhcyBpbmZlcnJlZCAKICAgIHByaXZhdGUgc3RhdGljIDxUPiBNYXA8VCwgTGlzdDxUPj4gZ2V0U3R1ZmZCYWQoKSB7CiAgICAgICAgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7CiAgICAgICAgbWFwLnB1dCgiYSIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKICAgICAgICByZXR1cm4gKE1hcDxULCBMaXN0PFQ+PikgbWFwOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7CiAgICAgICAgLy8gVGhlIHNhbWUgZ2V0U3R1ZmYoKSBjYWxsIHdvcmtzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSB3YW50IHN0cmluZ3Mgb3IgaW50ZWdlcnMKICAgICAgICAvLyBUaGUgb25seSB3YXkgdGhpcyBpcyBwcm92YWJsZSB0eXBlIHNhZmUgaXMgYW4gZW1wdHkgbWFwIG9yIG51bGwuCiAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBzdHJNYXAgPSBnZXRTdHVmZigpOwogICAgICAgIE1hcDxJbnRlZ2VyLCBMaXN0PEludGVnZXI+PiBpbnRNYXAgPSBnZXRTdHVmZigpOwoKICAgICAgICBzdHJNYXAucHV0KCJhIiwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdHJNYXApOwogICAgICAgIGludE1hcC5wdXQoMSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbnRNYXApOwoKICAgICAgICAvLyBXZSBhc2sgZm9yIGFuIGludCBtYXAsIHdoaWNoIGlzIGFsbG93ZWQKICAgICAgICBNYXA8SW50ZWdlciwgTGlzdDxJbnRlZ2VyPj4gYmFkSW50TWFwID0gZ2V0U3R1ZmZCYWQoKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBmb3IgKEludGVnZXIgaSA6IGJhZEludE1hcC5rZXlTZXQoKSkgewogICAgICAgICAgICAgICAgLy8gQnV0IGl0IGhhcyBhIHN0cmluZyBpbiBpdCwgd2hpY2ggdGhyb3dzIHdoZW4gd2UgYWNjZXNzIGEgbm9uLXN0cmluZyBtZXRob2QKICAgICAgICAgICAgICAgIGkuaW50VmFsdWUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICB9Cn0=