Skip to Main Content

Java APIs

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

why generics cause "unchecked cast" on ObjectOutputStream.readObject?

843793Feb 10 2006 — edited May 4 2007
Consider the following serialization/deserialization test class:
import java.io.*;
import java.util.*;

public class TestSerialzationAndGenerics {
	
	public static void main(String[] args) throws Exception {
		List listUntyped = new ArrayList();
		Set<Object> setTyped = new HashSet<Object>();
		
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream( baos );
		oos.writeObject( listUntyped );
		oos.writeObject( setTyped );
		
		ObjectInputStream ois = new ObjectInputStream( new ByteArrayInputStream( baos.toByteArray() ) );
		List listUntypedDeser = (List) ois.readObject();
		Set<Object> setTypedDeser = (Set<Object>) ois.readObject();
		
		System.out.println("listUntyped.equals(listUntypedDeser): " + listUntyped.equals(listUntypedDeser));
		System.out.println("setTyped.equals(setTypedDeser): " + setTyped.equals(setTypedDeser));
	}
	
}
Critical: compile it with
	-Xlint:all
Then run it. It should work just fine, outputting:
	listUntyped.equals(listUntypedDeser): true
	setTyped.equals(setTypedDeser): true
as expected.

My question actually concerns the compilation step: why does the line
		List listUntypedDeser = (List) ois.readObject();
compile just fine, but the line
		Set<Object> setTypedDeser = (Set<Object>) ois.readObject();
cause javac to emit this warning:
		TestSerialzationAndGenerics.java:17: warning: [unchecked] unchecked cast
		found   : java.lang.Object
		required: java.util.Set<java.lang.Object>
? Both lines are just casts after all, but one is an untyped Collection cast while the other one is a cast to a generified Collection. For some reason, javac seems to have a problem with generified casts.

Am I doing something wrong?

Is there any way around this?

A google search only turned up 3 relevant postings, with only 1 in english:
http://forum.java.sun.com/thread.jspa?messageID=3655969
This forum posting touches on this issue, but they never addressed my question above which is why the generified cast is a problem when the untyped cast is not.

Eargerly awaiting your thoughts...
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jun 1 2007
Added on Feb 10 2006
13 comments
1,128 views