[
https://issues.apache.org/jira/browse/GROOVY-11508?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17892651#comment-17892651
]
James Daugherty commented on GROOVY-11508:
------------------------------------------
As for static example, the class file that's generated in 3.x shows:
Child Class:
{code:java}
public class Child extends Parent implements GormEntity<Child> {
// Only including the getAll method() for discussion purposes
@TraitBridge(
traitClass = GormEntity.class,
desc = "()Ljava/util/List;"
)
public static List<Child> getAll() {
CallSite[] var0 = $getCallSiteArray();
return
(List)ScriptBytecodeAdapter.castToType(var0[4].call(GormEntity$Trait$Helper.class,
Child.class), List.class);
}
} {code}
Parent Class
{code:java}
public class Parent implements GormEntity<Parent>, GroovyObject {
// Only including the getAll method() for discussion purposes
@TraitBridge(
traitClass = GormEntity.class,
desc = "()Ljava/util/List;"
)
public static List<Parent> getAll() {
CallSite[] var0 = $getCallSiteArray();
return
(List)ScriptBytecodeAdapter.castToType(var0[4].call(GormEntity$Trait$Helper.class,
Parent.class), List.class);
}
} {code}
I would have expected this behavior since the trait resolution in the docs
([https://docs.groovy-lang.org/latest/html/documentation#_default_conflict_resolution])
says the last declared trait chooses the method that's copied to the
implementing class. The data mapping project in Grails took advantage of this
so that a child would invoke the child specific code, while a parent would
invoke the parent one.
> 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
>
> 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)