Groovy bug:category现在可以处理抽象iterable类
我注意到Groovy 2.4.x版完全打破了我的DSL语言。一段时间后,我减少了这个问题:Groovy类别现在不适用于抽象iterable类 举个例子:Groovy bug:category现在可以处理抽象iterable类,groovy,metaprogramming,dsl,metaclass,Groovy,Metaprogramming,Dsl,Metaclass,我注意到Groovy 2.4.x版完全打破了我的DSL语言。一段时间后,我减少了这个问题:Groovy类别现在不适用于抽象iterable类 举个例子: // a very simple Java abstract class that implements Iterable public abstract class MyAbstractClass implements Iterable<Number> { public final int num; public
// 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);
}
}
因此,Groovy没有使用在MyCategory
中定义的plus
,而是将每个参数转换为List
,然后使用为List
定义的默认Groovy方法中的plus
我已经在Groovy tracker中创建了一个罚单,但是现在这个bug完全破坏了我的DSL语言,我不能强迫用户使用Groovy的早期版本(在2.2.x中都可以正常工作)。那么,在这个bug被修复之前,我们能提出一些解决方案吗?(如果它将被修复…是否可以截取List.plus()方法,然后执行您想要的操作?(我花了一个小时尝试这种方法,但没有取得任何成果。)@Michaelester不幸的是,我也不知道如何截取List.plus()是否可以截取List.plus()方法,然后做你想做的事?(我花了一个小时尝试这种方法,但没有取得任何进展。)@Michaelester不幸的是,我也不知道如何拦截List.plus()
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
}