ArrayList" .add"和"<<&#;访问`super`时Groovy中的不同行为

时间:2017-02-24 03:47:04

标签: inheritance arraylist groovy

在Groovy中使用ArrayList时,seems that <<.add的别名,但是在这个小例子中它不是:

class MyList extends ArrayList<Integer> {

    @Override
    boolean add(Integer num) {
        println "I'm doing something cool here!"
    }

    boolean insert(Integer num) {
        println "I'm adding it for real"
        // super.add(num) works as expected
        super << num   
    }
}

def ml = new MyList();
ml.insert(100)
assert ml.size() == 1

输出:

I'm adding it for real
I'm doing something cool here!
Caught: Assertion failed: 

assert ml.size() == 1
       |  |      |
       [] 0      false

Assertion failed: 

assert ml.size() == 1
       |  |      |
       [] 0      false

如果我使用super.add(num)它会传递断言并且仅打印&#34;我将其添加为真实&#34;

有人可以向我解释为什么super <<正在调用自己而不是父类,以及为什么在使用<<时它没有被添加到数组中?

1 个答案:

答案 0 :(得分:2)

原因是您已经覆盖了ArrayList.add方法,但也违反了合同:您不会从重写方法返回任何内容,而应返回boolean的实例。

super.add(num)按预期工作,因为您直接致电ArrayList.add

<<的情况下,

addList的别名。现在,super << num将来电委托给DefaultGroovyMethods,后者又调用了add上的List。但在这种特殊情况下,add中的ArrayList不是add中的MyList而是add中的class MyList extends ArrayList<Integer> { @Override boolean add(Integer num) { println "I'm doing something cool here!" return super.add(num) } boolean insert(Integer num) { println "I'm adding it for real" // super.add(num) works as expected super << num } } def ml = new MyList(); ml.insert(100) assert ml.size() == 1 ,正如我在开头所写的那样,违反了com.3rdparty.foo合同。以下代码效果很好:

package com.3rdparty.foo;

public class Bar {
    public void someMethod () { ... }

    int ppField;
}