`
scanfprintf123
  • 浏览: 79130 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Groovy中的隐式构造函数

阅读更多

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"]
 
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics