Grails 成员变量错误地变为null?
我观察到一个断言失败,我试图在下面描述它。简单地说,当我调用重写的方法时,初始化的类成员会错误地变为nullGrails 成员变量错误地变为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
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}