Hi,

I encountered an issue with @CompileStatic. Consider following code:

import groovy.transform.CompileStatic

@CompileStatic
class E extends BImpl {
    @Override
    public void a() {
        super.a();
    }
    public static void main(String[] args) { }
}
interface A {
    void a();
}
interface B extends A {
    @Override
    void a();
}
class AImpl implements A {
    @Override
    public void a() {
    }
}
class BImpl extends AImpl implements B {
}

It will fail to run with the following error:

Bug.groovy: 7: [Static type checking] - Abstract method a() cannot be called 
directly
@ line 7, column 9.
           super.a();
           ^

However, without @CompileStatic this code runs just fine.
It also works in Java, as the called super method comes from AImpl, but STC in 
Groovy selects the abstract method from B instead.
This seems to be caused by 
https://github.com/apache/groovy/blob/ea6ba7c6fcfefe3d8abdfbb6e20a44b1ebb8823e/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java#L1091
where the distance to the interface is 1, but the distance to the class is 4.

To give more context: I initially encountered this issue when extending 
AbstractSet, overriding addAll for a fast path and delegating to super.addAll 
for the slow path. I think such a pattern is quite common.

Greetings,
Hannes

Reply via email to