Grails 成员变量错误地变为null?

Grails 成员变量错误地变为null?,grails,groovy,Grails,Groovy,我观察到一个断言失败,我试图在下面描述它。简单地说,当我调用重写的方法时,初始化的类成员会错误地变为null abstract class A<T> { T target def something() { assert target != null // sanity check -- fails when invoked below return this } } class B extends A<Som

我观察到一个断言失败,我试图在下面描述它。简单地说,当我调用重写的方法时,初始化的类成员会错误地变为null

abstract class A<T> {
    T target

    def something() {
        assert target != null     // sanity check -- fails when invoked below
        return this
    }
}

class B extends A<Something> {
    static B makeB() {
        def b = new B()
        b.target = new Something();
        assert b.target != null
        return b
    }
}

// package test
// Test code
//
def b = B.makeB()       // <-- success.
assert b != null
assert b.target != null
b.something()           // <-- fails assertion
print "Success!"
我在生成一个最小的测试用例时遇到了问题——上面的“Long-in-place某物”在compileonline.com上成功运行,但在我们的机器上没有使用我们的代码

如果我在子类B中重新实现something方法,问题就会消失

有没有人观察到类似的效果?我对此已经很失望。

发现问题:Mixin使用相同的成员名称 通过仔细检查代码和局部堆栈变量,我们发现有一个实例变量目标正在接收分配消息。据推测,任何与mixin实例变量共享名称的实例变量都应该遵循我上面描述的行为,但我们不知道完整的条件集

nod@cfrick最合理的解决方案是将变量target重命名为其他名称

后续问题 这是预期的行为吗?在一片糟糕的海洋中,最好的解决方案是什么? 新的Groovy编译器或Grails堆栈是否改变了这种行为? 仍然相关的最小测试用例是什么?
什么课在哪?您也可以添加它吗?它恰好是一个Grails域对象-这就是我不理解最小失败测试用例的地方。可能相关:A同时扩展了某物和某物。LSE扩展了某物。事实上,我在代码中用Long替换了某物,同样的失败也发生了。仍然没有找到一个独立失败的测试用例。那么,您使用的groovy版本是什么?上面的代码在2.3.7中也适用于我,使用类Something{}尝试为属性添加一个带有println和/或stacktrace的setter,可能会给出一些启示:void setargett t t{println将目标设置为“$t”;grails.util.GrailsUtil.deepSanitizenew ExceptionDon't null me bro!.printStackTrace;this.target=t}