Bug 89940 - [1.5][compiler] wrong cast allowed
Summary: [1.5][compiler] wrong cast allowed
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.1   Edit
Hardware: PC All
: P3 normal (vote)
Target Milestone: 3.4 M3   Edit
Assignee: Philipe Mulet CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2005-04-01 07:24 EST by Tom Hofmann CLA
Modified: 2007-10-29 06:08 EDT (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Tom Hofmann CLA 2005-04-01 07:24:00 EST
I20050331-2000

Consider this snippet:

package generics2;

import java.util.List;

public class Casts {
	void foo(List<Object> objects, List raw) {

	    List<Number> numbers;
	    List<? extends Number> ext;
	    
	    numbers= (List<Number>) objects; // correct - cast error
	    ext= (List<? extends Number>) objects; // wrong, should fail

	    ext= raw; // correct - raw conversion warning issued
	    numbers= raw; // correct - raw conversion warning issued
	}
}

- the snippet compiles with eclipse. On the second assignment it issues a "check
against erased type" warning, but it should fail. Javac output follows:

------- javac ------------
javac 1.5.0
/opt/eclipse/workspaces/runtime/workbench/AAATest/generics2/Casts.java:11:
inconvertible types
found   : java.util.List<java.lang.Object>
required: java.util.List<java.lang.Number>
	    numbers= (List<Number>) objects;
                                    ^
/opt/eclipse/workspaces/runtime/workbench/AAATest/generics2/Casts.java:12:
inconvertible types
found   : java.util.List<java.lang.Object>
required: java.util.List<? extends java.lang.Number>
	    ext= (List<? extends Number>) objects;
                                          ^
/opt/eclipse/workspaces/runtime/workbench/AAATest/generics2/Casts.java:14:
warning: [unchecked] unchecked conversion
found   : java.util.List
required: java.util.List<? extends java.lang.Number>
	    ext= raw;
                 ^
/opt/eclipse/workspaces/runtime/workbench/AAATest/generics2/Casts.java:15:
warning: [unchecked] unchecked conversion
found   : java.util.List
required: java.util.List<java.lang.Number>
	    numbers= raw;
                     ^
2 errors
2 warnings
Comment 1 Philipe Mulet CLA 2005-05-13 17:31:37 EDT
According to JLS-5.5 (3rd edition), cast is ok if List<? extends Number> and
List<Object> are provably distinct (JLS-4.5.1).

But I agree here that the types are distinct, and cast should fail.


Comment 2 Philipe Mulet CLA 2005-05-14 09:26:52 EDT
Indeed the spec allows this scenario as unchecked cast. 
Closing as a javac bug.

Comment 3 Philipe Mulet CLA 2005-05-14 09:55:22 EDT
Added GenericTypeTest#test666. Scary number.
Comment 4 Philipe Mulet CLA 2007-09-27 09:16:31 EDT
The spec is being revised to be stricter near cast conversion.
Reopening.
Comment 5 Philipe Mulet CLA 2007-10-09 09:29:42 EDT
If tightening the rules, I would obtain:

----------
1. WARNING in X.java (at line 3)
	void foo(List<Object> objects, List raw) {
	                               ^^^^
List is a raw type. References to generic type List<E> should be parameterized
----------
2. ERROR in X.java (at line 8)
	numbers= (List<Number>) objects; // correct - cast error
	         ^^^^^^^^^^^^^^^^^^^^^^
Cannot cast from List<Object> to List<Number>
----------
3. ERROR in X.java (at line 9)
	ext= (List<? extends Number>) objects; // wrong, should fail
	     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Cannot cast from List<Object> to List<? extends Number>
----------
4. WARNING in X.java (at line 11)
	ext= raw; // correct - raw conversion warning issued
	     ^^^
Type safety: The expression of type List needs unchecked conversion to conform to List<? extends Number>
----------
5. WARNING in X.java (at line 12)
	numbers= raw; // correct - raw conversion warning issued
	         ^^^
Type safety: The expression of type List needs unchecked conversion to conform to List<Number>
----------
5 problems (2 errors, 3 warnings)
Comment 6 Philipe Mulet CLA 2007-10-09 16:38:21 EDT
Released for 3.4M3.
Fixed

Also see bug 158870 for combined patch.
Comment 7 Maxime Daniel CLA 2007-10-29 06:08:00 EDT
Verified for 3.4 M3 using build I20071029-0010.