相同的linkedlist代码在Groovy和Java之间的不同行为,为什么



我正在使用linkedlist作为时髦的堆栈

正如Doc所说,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

在时髦中奔跑

$ 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

似乎是时髦的一个"特征"。默认的 Groovy 方法描述为 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提交的错误报告描述了它,并提供了一些额外的评论: 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.

最新更新