Groovy 中提供了一种可以将List直接转成对象的方式,这种方式将隐式调用Groovy bean中定义的构造函数来创建对象。
假设我们有如下Groovy bean定义:
class Addr{
String homeAddr
String workAddr
Addr(def home,def office)
{
this.homeAddr=home
this.workAddr=office
}
}
那么创建Addr对象将有如下几种方式:
1. 显示调用构造函数Addr(def home,def office)
def addr=new Addr("home","office")
2. 显示使用as来调用对应的构造函数
def addr=["home","office"] as Addr
3. 隐式的让groovy通过类型推断来调用对应的构造函数
Addr addr=["home","office"]
对于第2种第3种方式,groovy bean需要显示提供对应的构造函数定义。
如果Addr groovy bean的定义没有显示提供对应的构造函数或者提供错误的构造函数,那么都不能通过将List的方式来使用groovy bean的构造函数:
没有提供对应的构造函数:
class Addr{
String homeAddr
String workAddr
}
Addr addr=["home","office"] // def addr=["home","office"] as Addr
异常:
Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '[home, office]' with class 'java.util.ArrayList' to class 'constructor.Addr'
提供错误的构造函数(比如说错误的参数个数或者参数类型):
class Addr{
String homeAddr
String workAddr
Addr(int home,def office) //wrong argument type
{
this.homeAddr=home
this.workAddr=office
}
}
Addr addr=["home","office"]
class Addr{
String homeAddr
String workAddr
Addr(def home,def office,def nonUse) //wrong argument numbers
{
this.homeAddr=home
this.workAddr=office
}
}
Addr addr=["home","office"]