相同的linkedlist代码groovy和java之间的不同行为,为什么

时间:2013-10-18 03:09:57

标签: java groovy

我在groovy中使用linkedlist作为堆栈

正如文档所说,pop()从第一个

获取榆树
Stack Method  Equivalent Deque Method  
push(e)       addFirst(e) 
pop()         removeFirst()

所以linkedlist [1,2,3]应该pop()1 2 3

并且它在Java中,但不是在groovy中。为什么?

以下测试

A.java

import java.util.*;

public class A{


    public static void main(String[] args){

        String[] x = "1/2/3/".split("/");
        LinkedList <String> stack = new LinkedList<String>(Arrays.asList(x));
        System.out.println(stack.pop());
    }
}

编译并运行

$ javac A.java
$ java A
1

在groovy中运行

$ ln -s A.java A.groovy
$ groovy A.groovy
3

这是我的java和groovy版本

$ java -version
java version "1.6.0_51"
Java(TM) SE Runtime Environment (build 1.6.0_51-b11-457-11M4509)
Java HotSpot(TM) 64-Bit Server VM (build 20.51-b01-457, mixed mode)

$ groovy -version
Groovy Version: 2.1.5 JVM: 1.6.0_51 Vendor: Apple Inc. OS: Mac OS X

1 个答案:

答案 0 :(得分:6)

这似乎是groovy的“特征”。 Default Groovy Methods被描述为This class defines new groovy methods which appear on normal JDK classes inside the Groovy environment.

DefaultGroovyMethods提供的方法之一是pop(),其描述为:Removes the last item from the List.因此看起来Groovy编织在pop()的不同实现中,这是与LinkedList默认为您提供的内容相冲突。

几年前针对GDM提起的{p> A bug report描述最佳,并提供了一些额外的评论:LinkedList seems to implement List and a pop/push method, thus the classes method should not be shadowed by a DGM method. Only if we had a LinkedList#pop/push method in DGM, it should be different.