JDK-6964597 : Cannot cast to non-static inner class of generic outer class
  • Type: Bug
  • Component: tools
  • Sub-Component: javac
  • Affected Version: 6u10
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: linux
  • CPU: x86
  • Submitted: 2010-06-28
  • Updated: 2012-03-20
  • Resolved: 2010-12-01
Related Reports
Duplicate :  
Description
FULL PRODUCT VERSION :
java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8) (6b18-1.8-0ubuntu1)
OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)


ADDITIONAL OS VERSION INFORMATION :
Linux antigua 2.6.32-22-generic #36-Ubuntu SMP Thu Jun 3 19:31:57 UTC 2010 x86_64 GNU/Linux


EXTRA RELEVANT SYSTEM CONFIGURATION :
Using Ubuntu 10.04 with Java from package openjdk-6-jdk version 6b18-1.8-0ubuntu1

A DESCRIPTION OF THE PROBLEM :
The java compiler produces an error message when casting an object to a type, which is a non-static inner class of a generic outer class (e.g Test<?>.Inner). The same type is valid for variable declarations and for instanceof expression.

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile the supplied java code with javac.

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
a .class file
ACTUAL -
three error messages about syntax errors

ERROR MESSAGES/STACK TRACES THAT OCCUR :
Test.java:12: ')' expected
            i = (Test<?>.Inner) o;
                        ^
Test.java:12: ';' expected
            i = (Test<?>.Inner) o;
                         ^
Test.java:12: illegal start of expression
            i = (Test<?>.Inner) o;
                              ^
3 errors

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
class Test<T> {
    
    class Inner {}
    
    public static void main(String args[]) {
        Test<?> t = new Test<Object>();
        
        Object o = t.new Inner();
        
        Test<?>.Inner i;
        if (o instanceof Test<?>.Inner) {
            i = (Test<?>.Inner) o;
        }
    }
}
---------- END SOURCE ----------