为什么我不能在Groovy中声明一个People
数组,如图所示。
也许我缺乏对课程的深刻理解
class People {
Integer id
}
class Job {
def func() {
People[] p = new People[10]
}
}
我收到错误的人[]无法应用于app.People []
答案 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之间存在一个显着差异。在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[]
这足以用您的模型属性模拟通用对象。