CSR :
|
|
Relates :
|
Summary ------- A code that names an inner class is erroneously classified as raw and as a result is erroneously rejected. Problem ------- In the example that follows, javac determines erroneously that `getter` has a raw type (`G.Getter`). The type of `getter` is deduced as the raw type `Getters<T>.Getter` by javac which is clearly not since `T`, the type parameter of `Getters<T>` is not omitted. Since javac thinks that `G` is raw, it raises the `Object cannot be converted to T` message in the following example. The question is whether it should be treated as raw or not in the scenario where the qualifying type is a type parameter, as in `G.Getter`. In this case `Getter` is an inherited member from the supertype `Getters<T>`: ``` static abstract class Getters<T> { abstract class Getter { abstract T get(); } } static class Usage<T, G extends Getters<T>> { public T test(G.Getter getter) { return getter.get(); // incompatible types: Object cannot be converted to T } } ``` According to 4.8 Raw Types a "rare" type occurs when the inner is a partially raw type but the definition of Getter doesn't take any type variables, so this is not a case of a "rare" type. G.Getter describes a type with a qualifying type being a type parameter which is not raw and moreover there is an instantiation of its bound. Not looking into the bounds of G is a compiler bug. Solution -------- Fix javac to have the ability to traverse type bounds in such cases (isRaw). Specification ------------- We believe there are no changes needed in the specification but you can find linked the JDK-8030746; a currently open spec bug around the same area -- 4.10: Define subtyping for inner classes of parameterized types.