[
https://issues.apache.org/jira/browse/GROOVY-10251?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Eric Milles updated GROOVY-10251:
---------------------------------
Priority: Minor (was: Major)
> STC infers a type that does not respect the bound of type variable
> ------------------------------------------------------------------
>
> Key: GROOVY-10251
> URL: https://issues.apache.org/jira/browse/GROOVY-10251
> Project: Groovy
> Issue Type: Bug
> Components: Static Type Checker
> Reporter: Thodoris Sotiropoulos
> Assignee: Eric Milles
> Priority: Minor
>
> I have the following program
> {code:java}
> class A<T1, T2> {
> T2 x;
> A(T2 x) {
> this.x = x;
> }
> }
> class B {
> <T1 extends Number, T2 extends A<Float, T1>> void foo(T2 x1, T1 x2) {
> T1 y = x1.x; // CCE at runtime
> }
> }
> class C<T extends D> {
> T x;
> C(T x) {
> this.x = x;
> }
> void test() {
> (new B()).foo(x, foo());
> }
> static <X extends Number> X foo() {
> return null;
> }
> }
> class D extends A<Float, String> {
> D() {
> super("");
> }
>
> }
> class Main {
> public static void main(String[] args) {
> (new C<D>(new D())).test();
> }
> }
> {code}
> h3. Actual behaviour
> The compiler compiles the program, but we receive a ClassCastException at
> runtime
> {code:java}
> Exception in thread "main"
> org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast
> object '' with class 'java.lang.String' to class 'java.lang.Number'
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToNumber(DefaultTypeTransformation.java:179)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:294)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:251)
> at
> org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318)
> at B.foo(groovy16.groovy:10)
> at C.test(groovy16.groovy:21)
> at Main.main(groovy16.groovy:38)
> {code}
> h3. Expected behaviour
> The compiler should reject the above program.
> Specifically, the call `(new B()).foo(x, foo());` at line 21 is not
> type-correct. This is because the function at line 9 is instantiated with `T1
> = Number` and `T2 = A<Float, Number>`. However, during the call at line 21 we
> pass something whose type is `D`, which is a subtype of `A<Float, String`>
> and not of `A<Float, Number>`.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)