java - generics collections.mixin raw and generic type. Integer -> String - exception but String -> Integer works good -
i confusing 2 code snippets:
snippet 1
list list = new arraylist(); list.add("1"); iterator<integer> iterator = list.iterator(); system.out.println(iterator.next()); this code executes , outs 1 console
snippet 2
list list = new arraylist(); list.add(1); iterator<string> iterator = list.iterator(); system.out.println(iterator.next()); result of - runtimeexception
java.lang.classcastexception: java.lang.integer cannot cast java.lang.string i confusing because both these rows wrong:
integer integer = "123"; string string = 1; it compile error.
why generis behaviour different?
p.s.
i prepare scjp exam , don't mix raw type , generics;
printstream, class of system.out, has number of println overloads. in particular, has an overload takes object , an overload takes string.
in first example,
list list = new arraylist(); list.add("1"); iterator<integer> iterator = list.iterator(); system.out.println(iterator.next()); the compiler expects iterator.next() produce integer, , best match object version of println. compiler generates call object version of method, happens work fine string comes out of iterator.
in second example,
list list = new arraylist(); list.add(1); iterator<string> iterator = list.iterator(); system.out.println(iterator.next()); the compiler expects iterator.next() produce string, , best match string version of println. compiler generates call string version of method, , due type erasure (which makes runtime type of iterator.next() object), generates runtime cast object string. cast fails integer comes out of iterator, causing exception see.
Comments
Post a Comment