Groovy bug:category现在可以处理抽象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

我注意到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 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
}