我注意到Groovy版本2.4.x完全破坏了我的DSL语言。一段时间后,我减少了问题:Groovy类现在不适用于抽象可迭代类。
考虑例子:
// a very simple Java abstract class that implements Iterable
public abstract class MyAbstractClass implements Iterable<Number> {
public final int num;
public MyAbstractClass(int num) { this.num = num; }
@Override
public String toString() { return String.valueOf(num); }
@Override
public Iterator<Number> iterator() {
//just some dummy empty iterator
return new Iterator<Number>() {
@Override
public boolean hasNext() { return false; }
@Override
public Number next() { return null; }
};
}
}
// a single implementation
public class MyAbstractClassImpl extends MyAbstractClass {
public MyAbstractClassImpl(int a) { super(a); }
}
//category that overloads PLUS operator
class MyCategory {
public static MyAbstractClass plus(MyAbstractClass a, MyAbstractClass b) {
return new MyAbstractClassImpl(a.num + b.num);
}
}
测试用例:
use(MyCategory) {
def a = new MyAbstractClassImpl(1)
def b = new MyAbstractClassImpl(2)
println a + b //expected 3, but received []
assert (a + b).num == 3 // so here we see exception
}
因此,Groovy不是使用plus
中定义的MyCategory
,而是将每个参数转换为List
,然后使用{{1}定义的默认Groovy方法中的plus
}}。
我在Groovy issue跟踪器中创建了一个票证,但是现在这个bug完全破坏了我的DSL语言,我不能强迫用户使用以前版本的Groovy(在2.2.x中所有作品)精细)。那么,可以建议任何解决方法,直到修复此错误? (如果它将被修复......)