【问题标题】:Dynamically adding elements to ArrayList in Groovy在 Groovy 中动态地将元素添加到 ArrayList
【发布时间】:2014-08-03 01:28:12
【问题描述】:

我是 Groovy 的新手,尽管阅读了很多关于此的文章和问题,但我仍然不清楚发生了什么。 据我目前了解,当您在 Groovy 中创建一个新数组时,底层类型是 Java ArrayList。这意味着它应该是可调整大小的,您应该能够将其初始化为空,然后通过 add 方法动态添加元素,如下所示:

MyType[] list = []
list.add(new MyType(...))

这可以编译,但是在运行时失败:没有方法签名:[LMyType;.add() 适用于参数类型:(MyType) 值:[MyType@383bfa16]

执行此操作的正确方法或正确类型是什么?

【问题讨论】:

    标签: java list arraylist groovy


    【解决方案1】:

    执行此操作的 Groovy 方法是

    def list = []
    list << new MyType(...)
    

    它创建一个列表并使用重载的leftShift 运算符来附加一个项目

    有关大量示例,请参阅 Groovy docs on Lists

    【讨论】:

    • 好吧,这行得通。如果您像这样定义列表,实际上 list.add(new MyType(...)) 也可以工作。但我有一个评论和一个问题。评论:所以当你创建它时,没有办法指定你将在列表中放入什么类型?问题:为什么它会以这种方式工作,而如果我指定了一个类型,它就不会?在这种情况下,它看起来好像使用的是不同的底层类型,然后是 ArrayList。
    • 你可以使用List&lt;MyList&gt; list = [],但是如果你不使用CompileStatic,它基本上会被忽略
    • 你也可以def list = [new MyType(...)]
    【解决方案2】:

    您实际创建的内容:

    MyType[] list = []
    

    是大小为 0 的固定大小数组(不是列表)。您可以创建大小为 4 的固定大小数组:

    MyType[] array = new MyType[4]
    

    但是当然没有 add 方法。

    如果您使用def 创建列表,则类似于使用Object 创建此实例(您可以阅读有关def here 的更多信息)。而[] 在这种情况下会创建空的ArrayList

    因此,使用def list = [],您可以使用ArrayListadd() 方法追加新项目

    list.add(new MyType())
    

    或者更常规的重载左移运算符的方式:

    list << new MyType() 
    

    【讨论】:

    • 谢谢。那么有没有办法创建一个特定类型的动态列表呢?
    • tim_yates 在对第二个答案的评论中已经回答了这个问题 :)
    猜你喜欢
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2021-07-01
    • 2016-01-01
    • 2017-11-08
    • 2011-10-05
    • 2017-10-11
    相关资源
    最近更新 更多