[
https://issues.apache.org/jira/browse/GROOVY-12602?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Scott Murphy Heiberg updated GROOVY-12602:
------------------------------------------
Description:
{code:groovy}
import java.util.function.Supplier
@groovy.transform.CompileStatic
trait U {
String getUname() { 'u' }
String a() { Supplier<String> s = () -> getUname(); s.get() }
}
class C implements U {}
assert new C().a() == 'u'
{code}
Actual:
{noformat}
java.lang.ClassCastException: class java.lang.Class cannot be cast to class U
at U$Trait$Helper$_a_lambda1.doCall(...)
{noformat}
The same happens for a super trait's accessor read as {{uname}} or called as
{{getUname()}} in a lambda, for a lambda in a lambda, for a closure in a lambda
and for a lambda in a trait field initializer.
Expected: the assertion passes, as it does without {{@CompileStatic}}, with
{{@TypeChecked}}, and with a closure instead of the lambda.
A closure in a trait method is rehydrated with the trait instance as its this
object. A statically compiled lambda is not, and the lambda writer passes the
trait helper class as the lambda's this object because the helper method is
static. The implicit-this call then casts that class to the trait.
Seen in 4.0.33, 5.0.8 and 6.0.0.
PR: https://github.com/apache/groovy/pull/3129
was:
{code:groovy}
import java.util.function.Supplier
@groovy.transform.CompileStatic
trait U {
String getUname() { 'u' }
String a() { Supplier<String> s = () -> getUname(); s.get() }
}
class C implements U {}
assert new C().a() == 'u'
{code}
Actual:
{noformat}
java.lang.ClassCastException: class java.lang.Class cannot be cast to class U
at U$Trait$Helper$_a_lambda1.doCall(...)
{noformat}
The same happens for a super trait's accessor read as {{uname}} or called as
{{getUname()}} in a lambda, for a lambda in a lambda, for a closure in a lambda
and for a lambda in a trait field initializer.
Expected: the assertion passes, as it does without {{@CompileStatic}}, with
{{@TypeChecked}}, and with a closure instead of the lambda.
A closure in a trait method is rehydrated with the trait instance as its this
object. A statically compiled lambda is not, and the lambda writer passes the
trait helper class as the lambda's this object because the helper method is
static. The implicit-this call then casts that class to the trait.
Seen in 4.0.33, 5.0.8 and 6.0.0.
> SC: a lambda in a trait method calling a trait instance method by implicit
> this throws ClassCastException: Class cannot be cast to the trait
> --------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: GROOVY-12602
> URL: https://issues.apache.org/jira/browse/GROOVY-12602
> Project: Groovy
> Issue Type: Bug
> Affects Versions: 4.0.33, 5.0.8, 6.0.0
> Reporter: Scott Murphy Heiberg
> Priority: Major
>
> {code:groovy}
> import java.util.function.Supplier
> @groovy.transform.CompileStatic
> trait U {
> String getUname() { 'u' }
> String a() { Supplier<String> s = () -> getUname(); s.get() }
> }
> class C implements U {}
> assert new C().a() == 'u'
> {code}
> Actual:
> {noformat}
> java.lang.ClassCastException: class java.lang.Class cannot be cast to class U
> at U$Trait$Helper$_a_lambda1.doCall(...)
> {noformat}
> The same happens for a super trait's accessor read as {{uname}} or called as
> {{getUname()}} in a lambda, for a lambda in a lambda, for a closure in a
> lambda and for a lambda in a trait field initializer.
> Expected: the assertion passes, as it does without {{@CompileStatic}}, with
> {{@TypeChecked}}, and with a closure instead of the lambda.
> A closure in a trait method is rehydrated with the trait instance as its this
> object. A statically compiled lambda is not, and the lambda writer passes the
> trait helper class as the lambda's this object because the helper method is
> static. The implicit-this call then casts that class to the trait.
> Seen in 4.0.33, 5.0.8 and 6.0.0.
> PR: https://github.com/apache/groovy/pull/3129
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)