Field of wildcard parameterized class is passed to anonymous class created with diamond; JDK bug?
Georgiy Rakov
georgiy.rakov at oracle.com
Tue May 12 13:23:10 UTC 2015
Hello,
let's consider following example:
classPar<U> {
Uf;
}
classCls<T> {
Cls(Tt) {}
}
public classTest70 {
public static voidtest() {
Par<?> a =newPar<>();
newCls<>(a.f) { };
}
}
JDK9b60 compiles it successfully however according to my understanding
compilation should have failed because:
1. The type of 'a' local variable is a parameterized type Par<?>.
2. According to following assertion from JLS 4.5.2 the type of the field
"f" of Par<?> is a fresh capture variable: null-type <: CAP <: Object:
If any of the type arguments in the parameterization of Care
wildcards, then:
o
The types of the fields, methods, and constructors in C|<|T_1
,...,T_n |>|are the types of the fields, methods, and
constructors in the capture conversion of C|<|T_1 ,...,T_n
|>|(§5.1.10
<http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.10>).
3. 'new Cls<>(a.f) { }' causes T to be inferred as capture variable CAP
presented in step 2.
4. According to following new assertion presented in JDK-8073593 issue
comment
<https://bugs.openjdk.java.net/browse/JDK-8073593?focusedCommentId=13622110&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13622110>compilation
error should occur because superclass of the anonymous class is inferred
as a type parameterized by type variable that was not declared as a type
parameter (the capture variable CAP).
***/_*It is a compile-time error*_/ if the superclass or
superinterface type of the anonymous class, T, or any subexpression
of T, has one of the following forms:
- A /_*type variable (4.4) that was not declared as a type
parameter*_/ (such as /_*a type variable produced by capture
conversion*_/ (5.1.10))
- An intersection type (4.9)
- A class or interface type, where the class or interface
declaration is not accessible from the class or interface in which
the expression appears.***
The term "subexpression" includes type arguments of parameterized
types (4.5), bounds of wildcards (4.5.1), and element types of array
types (10.1). It excludes bounds of type variables.***
Could you please tell if you agree that this is really a JDK bug.
Thank you,
Georgiy.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20150512/faf306e3/attachment-0001.html>
-------------- next part --------------
class Par<U> {
U f;
}
class Cls<T> {
Cls(T t) {}
}
public class Test70 {
public static void test() {
Par<?> a = new Par<>();
new Cls<>(a.f) { };
}
}
More information about the compiler-dev
mailing list