You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Eric Milles (Jira)" <ji...@apache.org> on 2023/01/06 02:07:00 UTC

[jira] [Assigned] (GROOVY-10897) Static Type Checking selects wrong method for abstract method call check

     [ https://issues.apache.org/jira/browse/GROOVY-10897?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Eric Milles reassigned GROOVY-10897:
------------------------------------

    Assignee: Eric Milles

> Static Type Checking selects wrong method for abstract method call check
> ------------------------------------------------------------------------
>
>                 Key: GROOVY-10897
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10897
>             Project: Groovy
>          Issue Type: Bug
>          Components: Static Type Checker
>    Affects Versions: 4.0.7
>            Reporter: Hannes Greule
>            Assignee: Eric Milles
>            Priority: Major
>
> Consider following code:
> {code:java}
> @CompileStatic
> class E extends BImpl {
>     @Override
>     void a() {
>         super.a();
>     }
>     static void main(args) { }
> }
> interface A {
>     void a()
> }
> interface B extends A {
>     @Override
>     void a()
> }
> class AImpl implements A {
>     @Override
>     void a() {
>     }
> }
> class BImpl extends AImpl implements B {
> } {code}
> Compiling it will fail with the error 
> {{[Static type checking] - Abstract method a() cannot be called directly}}
> However, when running it _without_ {{@CompileStatic}} or when writing similar code in Java, it will select the non-abstract method from {{AImpl}} instead.
> It seems like this is a problem in the code to choose the best method here: [https://github.com/apache/groovy/blob/ea6ba7c6fcfefe3d8abdfbb6e20a44b1ebb8823e/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java#L1091]
> The distance from {{BImpl}} to {{B}} to the interface is less than (1) the distance to {{AImpl}} (4), therefore the abstract method is chosen as best method.
> This originally happened when extending {{AbstractSet}} and calling {{{}super.addAll(...){}}}.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)