[
https://issues.apache.org/jira/browse/GROOVY-9965?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
mgroovy updated GROOVY-9965:
----------------------------
Labels: generics static (was: generi static)
> 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: generics, 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)