Groovy中的对象数组声明

时间:2018-06-16 04:31:14

标签: groovy

为什么我不能在Groovy中声明一个People数组,如图所示。 也许我缺乏对课程的深刻理解

class People {
    Integer id
}

class Job {
    def func() {
        People[] p = new People[10]
    }
}

我收到错误的人[]无法应用于app.People []

3 个答案:

答案 0 :(得分:3)

您显示的代码示例不会重现您在上述问题中提到的错误。它实际上已经破坏而且没有编译 - 方法func()缺少它的主体。如果您将代码更正为例如

class People {
    Integer id
}

class Job {
    def func() {
        People[] p = new People[10]
        assert p.size() == 10
        println p
    }
}

new Job().func()​

您将看到它产生预期结果 - 在Groovy Web控制台here中查看它。运行它时,您将看到以下输出到控制台:

[null, null, null, null, null, null, null, null, null, null]

Groovy与Java之间的区别

在数组初始化方面,Groovy和Java之间存在一个显着差异。在Java中,您可以像这样初始化People[]数组:

People[] p = new People[] { new People(), new People(), /* ... */ new People() };

它不能在Groovy中工作,因为Groovy保留{}用于闭包。在Groovy中,您可以将此类数组初始化为:

People[] p = [new People(), new People(), new People()] as People[]

答案 1 :(得分:2)

虽然Szymon Stepniak的答案对于Groovy 2.5及更低版本是正确的,但Java风格的数组初始化是新的parrot解析器实现Groovy 3.0和2.6增强功能的一部分。

release notes的示例:

def primes = new int[] {2, 3, 5, 7, 11}
assert primes.size() == 5 && primes.sum() == 28
assert primes.class.name == '[I'

def pets = new String[] {'cat', 'dog'}
assert pets.size() == 2 && pets.sum() == 'catdog'
assert pets.class.name == '[Ljava.lang.String;'

// traditional Groovy alternative still supported
String[] groovyBooks = [ 'Groovy in Action', 'Making Java Groovy' ]
assert groovyBooks.every{ it.contains('Groovy') }

答案 2 :(得分:0)

Szymon Stepniak 的回答是正确的。我将在我工作过的一些单元测试中指出另一个真实案例的例子(一般对象类型):

Object[] o = [YourModel] as Object[]

这足以用您的模型属性模拟通用对象。