[ https://issues.apache.org/jira/browse/GROOVY-11508?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17892810#comment-17892810 ]
James Daugherty commented on GROOVY-11508: ------------------------------------------ Concerning this example: {code:java} trait T<U> { U getSelf() { this } } class C<SELF extends C<SELF>> implements T<SELF> { } class D extends C<D> { } def c = new C().self def d = new D().self {code} This doesn't work for our case since the method isn't generated on the Child as an overload like in Groovy 3.x - it only exists on the trait. This means there's only 1 method that returns only the parent type. The ORM we're implementing multiple inheritance for allows querying on the shared types (Parent + Child) or Child based on which method is called. As for Java example, Java also doesn't support multiple inheritance, while Groovy has historically. The issue on our side is the copy method behavior was relied on to implement behavior & is documented in the groovy docs. One of our proposals was to make this a warning or add a compiler flag to opt-in to this behavior given how Groovy has handled this historically. > Multiple traits with related generic types cannot be used > --------------------------------------------------------- > > Key: GROOVY-11508 > URL: https://issues.apache.org/jira/browse/GROOVY-11508 > Project: Groovy > Issue Type: Bug > Components: Compiler > Affects Versions: 4.0.0 > Reporter: James Daugherty > Assignee: Eric Milles > Priority: Major > Attachments: screenshot-1.png, screenshot-2.png, screenshot-3.png > > > When updating Grails from Groovy 3.x to 4.x we discovered that GROOVY-5106 > prevents us from updating to Groovy 4 for the > [grails-data-mapping|https://github.com/grails/grails-data-mapping] (GORM) > project. Groovy-5106 does not take into account relationships between > generic types and groovy does not support inheritance in generic types on > traits so we have no workable solution for using Groovy 4. > > For example, the following is not possible in Groovy 4: > {code:java} > class Parent extends GormEntity<Parent> { > } > class Child extends GormEntity<Child> { > } > class GormEntity<? extends GormEntity> { // ? extends GormEntity is not > allowed > }{code} > > We have documented the impacts of this issue on the grails-data-mapping > project here: [https://github.com/grails/grails-data-mapping/issues/1811] > We have discovered that the original change could be reverted and continue to > work with the latest Java & Groovy. > > For Grails Data Mapping (GORM), there is support for inheritance between a > Parent & Child domain object. This is often implemented like this: > {code:java} > class Parent extends GormEntity<Parent> { > } > class Child extends GormEntity<Child> { > } > trait GormEntity<D> { // Simplified for this ticket > static D get(Serializable id) > > static List<D> getAll() > } > {code} > This allows someone to do the following in code: > {code:java} > Parent.get(1L) // Will find either a Child or Parent > Child.get(1L) // Will find only child types{code} > > Since Groovy-5106 does not take into account inheritance, can this change be > reverted or changed to a warning until inheritance is taken into account? -- This message was sent by Atlassian Jira (v8.20.10#820010)