What change of JLS 6/7 causes the following unchecked code with collections and generics to work in Java 7? -


the following code

import java.util.*; import java.io.*;  @suppresswarnings("unchecked") list<serializable> list = (list<serializable>) (list<?>)   collections.singletonlist(new object());  (object el : list) { // -> classcastexception   system.out.println(el); } 

is correct java (even though code suspicious). using javac , java 6 throws

exception in thread "main" java.lang.classcastexception: java.lang.object cannot cast java.io.serializable 

while runs without error when using javac , java 7.

is language change, fixed bug or hidden feature?

(note: code compiled eclipse runs without error on eclipse versions checked - helios kepler.)

you're polluting heap adding raw object collection (which you're having cast dance make happen). it's not technically illegal, bug.

when pulling value out of implicit iterator, java 6 compiler appears casting immediately, while java 7 compiler isn't. it's more efficient not cast serializable if doesn't need (since holding variable object), behavior undefined far understand jls. try running javap on 2 .class files , looking @ code right around for loop (probably right after invokeinterface call iterator.next()).


Comments

Popular posts from this blog

Unable to remove the www from url on https using .htaccess -