Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
2.5.5
Description
While reading about Java Generics and wildcards (see https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html), I came across the following code in the referenced oracle document
Collection<?> c = new ArrayList<String>(); c.add(new Object()); // Compile time error
Now, I decided to wrap this in a class and try it out in Java and then in Groovy.
Here is the Java code
import java.util.*; public class TestCollection { static Collection<?> c = new ArrayList<String>(); public static void main(String[] args) { c.add(new Object()); // Compile time error } }
and here is the groovy code
import java.util.*; import groovy.transform.CompileStatic; @CompileStatic public class TestCollection { static Collection<?> c = new ArrayList<String>(); public static void main(String[] args) { c.add(new Object()); // Compile time error println c.first(); } }
When I attempt to compile the Java code I get the following expected error
$ javac TestCollection.java TestCollection.java:7: error: incompatible types: Object cannot be converted to CAP#1 c.add(new Object()); // Compile time error ^ where CAP#1 is a fresh type-variable: CAP#1 extends Object from capture of ?
But, when I run the code through Groovy, I do not get a compile-time error. Instead, I get the following output
java.lang.Object@41a0aa7d
Attachments
Issue Links
- relates to
-
GROOVY-10588 TypeChecked/CompileStatic wildcard problems
- Resolved
-
GROOVY-10371 STC involves improper subtyping rules for parameterized types with wildcard types
- Resolved
-
GROOVY-6835 flow typing activated by if statement doing an "instanceof" check doesn't work as expected with interface types
- Closed
-
GROOVY-8084 Captured types doesn't work in @CompileStatic
- Closed
- links to