-
Bug
-
Resolution: Fixed
-
P2
-
6
-
b26
-
generic
-
windows_xp
-
Not verified
JLS 4.4 Type Variables says:
The members of a type variable X with bound T & I1 ... In are the members of the intersection type (§4.9) T & I1 ... In appearing at the point where the type variable is declared.
JLS 4.9 Intersection Types
The values of an intersection type are those objects that are values of all of the types Ti, for 1in.
-------------------------------------------------------------------------
The test below declares the generic method "static <W extends F & I2> void method(C<? extends W> arg)" ,
where E - class, F - class that extends E and implements I1; I, I1 - interfaces;
C - generic class that declares type variable <T extends E & I>.
There occures a capture conversion from C<? extends W> to C<S>.
According to 5.1.10 Capture Conversion:
If Ti is a wildcard type argument of the form ? extends Bi, then Si is a fresh type variable whose upper bound is glb(Bi, Ui[A1 := S1, ..., An := Sn]) and whose lower bound is the null type, where glb(V1,... ,Vm) is V1 & ... & Vm.
So, S has upper bound (E & I) & W.
So, the values of S are those objects that are values of all of the types E, I, W.
But test below fails.
-----------------Test code------------------------
import java.io.PrintStream;
class E {}
class F extends E implements I1 {}
interface I {}
interface I1 {}
class G extends F implements I {}
class C<T extends E & I> {
T field;
}
public class type15302 {
public static void main(String argv[]) {
System.exit(run(argv, System.out) + 95/*STATUS_TEMP*/);
}
public static int run(String argv[], PrintStream out) {
C<G> arg = new C<G>();
arg.field = new G();
method(arg);
return 0/*STATUS_PASSED*/;
}
static <W extends F> void method(C<? extends W> arg) {
F vf = arg.field;
I vi = arg.field;
I1 vi1 = arg.field;
E ve = arg.field;
W vt = arg.field;
}
}
------------OutPut------------------------------
Information:Compilation completed with 4 errors and 0 warnings
Information:4 errors
Information:0 warnings
C:\JLS\JLS3\lang\tests\lang\TYPE\12_type153\type15302.java
Error:Error:line (29)incompatible types
found : capture#955 of ? extends W
required: javasoft.sqe.tests.lang.type153.type15302.F
Error:Error:line (31)incompatible types
found : capture#671 of ? extends W
required: javasoft.sqe.tests.lang.type153.type15302.I1
Error:Error:line (32)incompatible types
found : capture#442 of ? extends W
required: javasoft.sqe.tests.lang.type153.type15302.E
Error:Error:line (33)incompatible types
found : capture#274 of ? extends W
required: W
The members of a type variable X with bound T & I1 ... In are the members of the intersection type (§4.9) T & I1 ... In appearing at the point where the type variable is declared.
JLS 4.9 Intersection Types
The values of an intersection type are those objects that are values of all of the types Ti, for 1in.
-------------------------------------------------------------------------
The test below declares the generic method "static <W extends F & I2> void method(C<? extends W> arg)" ,
where E - class, F - class that extends E and implements I1; I, I1 - interfaces;
C - generic class that declares type variable <T extends E & I>.
There occures a capture conversion from C<? extends W> to C<S>.
According to 5.1.10 Capture Conversion:
If Ti is a wildcard type argument of the form ? extends Bi, then Si is a fresh type variable whose upper bound is glb(Bi, Ui[A1 := S1, ..., An := Sn]) and whose lower bound is the null type, where glb(V1,... ,Vm) is V1 & ... & Vm.
So, S has upper bound (E & I) & W.
So, the values of S are those objects that are values of all of the types E, I, W.
But test below fails.
-----------------Test code------------------------
import java.io.PrintStream;
class E {}
class F extends E implements I1 {}
interface I {}
interface I1 {}
class G extends F implements I {}
class C<T extends E & I> {
T field;
}
public class type15302 {
public static void main(String argv[]) {
System.exit(run(argv, System.out) + 95/*STATUS_TEMP*/);
}
public static int run(String argv[], PrintStream out) {
C<G> arg = new C<G>();
arg.field = new G();
method(arg);
return 0/*STATUS_PASSED*/;
}
static <W extends F> void method(C<? extends W> arg) {
F vf = arg.field;
I vi = arg.field;
I1 vi1 = arg.field;
E ve = arg.field;
W vt = arg.field;
}
}
------------OutPut------------------------------
Information:Compilation completed with 4 errors and 0 warnings
Information:4 errors
Information:0 warnings
C:\JLS\JLS3\lang\tests\lang\TYPE\12_type153\type15302.java
Error:Error:line (29)incompatible types
found : capture#955 of ? extends W
required: javasoft.sqe.tests.lang.type153.type15302.F
Error:Error:line (31)incompatible types
found : capture#671 of ? extends W
required: javasoft.sqe.tests.lang.type153.type15302.I1
Error:Error:line (32)incompatible types
found : capture#442 of ? extends W
required: javasoft.sqe.tests.lang.type153.type15302.E
Error:Error:line (33)incompatible types
found : capture#274 of ? extends W
required: W
- relates to
-
JDK-6594284 NPE thrown when calling a method on an intersection type
-
- Closed
-
-
JDK-6711619 javac doesn't allow access to protected members in intersection types
-
- Closed
-
-
JDK-6557960 4.4: Allow array type as bound of type variable
-
- Open
-
-
JDK-6531075 Missing synthetic casts when accessing fields/methods of intersection types including type variables
-
- Closed
-