Groovy bug:类别现在可以使用抽象的可迭代类

时间:2016-06-20 11:18:21

标签: groovy metaprogramming dsl metaclass

我注意到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中所有作品)精细)。那么,可以建议任何解决方法,直到修复此错误? (如果它将被修复......)

0 个答案:

没有答案