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

mgroovy updated GROOVY-9965:
----------------------------
    Summary: Static generic method hiding instance method of same name leads to 
MME  (was: Static generic method hiding method of same name leads to MME)

> Static generic method hiding instance method of same name leads to MME
> ----------------------------------------------------------------------
>
>                 Key: GROOVY-9965
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9965
>             Project: Groovy
>          Issue Type: Bug
>          Components: Compiler
>    Affects Versions: 2.5.14
>         Environment: Windows 10
> jdk-11.0.10.9-hotspot
> IntelliJ 2020.3.2
>            Reporter: mgroovy
>            Priority: Major
>              Labels: generi, static
>
> *Problem*
>  Executing the test from the sample below throws:
> {code:java}
> groovy.lang.MissingMethodException: No signature of method: static 
> simple.groovy.bugs.gb_2021_03_04.TableGeneric.reference() is applicable for 
> argument types: (String) values: [FOO_schema]{code}
> even though TableGeneric's base class Table has a public method with 
> signature:
> {code:java}
> Table reference(String){code}
> It seems this method is hidden by the static Table method:
> {code:java}static <T extends Table> T reference(T table){code}
> *Expected*
>  Table#reference(String) should be called inside TableGeneric#reference() .
> *Sample Code*
> {code:java}
> import org.junit.Ignore
> import org.junit.Test
> class GroovyBugs_2021_03_04 {
>       @Test
>       @Ignore
>       void 'Groovy 2-5-14 TableGeneric#reference() MissingMethodException'() {
>               final TableGeneric tableGeneric = new TableGeneric("FOO")
>               println tableGeneric.reference()
>       }
> }
> {code}
> {code:java}
> import groovy.transform.Canonical
> @Canonical
> class Table {
>       final String name = "defaultTable"
>       Table reference(String schema) {
>               println "${this.getClass().simpleName}#reference(schema): 
> schema=$schema"
>               return this
>       }
>       // Commenting out this static method gets rid of the error
>       static <T extends Table> T reference(T table) {
>               println "Table.reference(table): table=$table"
>               assert null != table
>               return table
>       }
> }
> {code}
> {code:java}
> import groovy.transform.InheritConstructors
> @InheritConstructors
> class TableGeneric extends Table {
>       // If this method takes an argument, the error disappears
>       TableGeneric reference() {
>               println "${this.getClass().simpleName}#reference(): name=$name"
>               final String schema = "${name}_schema"
>               /*
>                               Passing schema = null leads to
>                               Table.reference(T table) being
>                               called with table=null
>               */
>               return (TableGeneric) super.reference(schema)
>       }
> }
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to