Scott Murphy Heiberg created GROOVY-12602:
---------------------------------------------

             Summary: 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: 5.0.8, 4.0.33, 6.0.0
            Reporter: Scott Murphy Heiberg


{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.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to