在前面的系列《Groovy Tip 20 "as"關鍵字的用法》中,我們已經談到了"as"關鍵字的一些激動人心的用法。本篇則要接著前篇的內容說下去,繼續來展現"as"關鍵字的一些更為激動人心的用法。
在前一篇中,我們談到了"as"關鍵字的一個用法是進行類型轉換。最常用的是形如下面的用法:
def list = ['a','b','c']
println list.class
def strs = list as String[]
println strs.class
這就是一個常用的類型轉換的代碼,從下面的打印結果可以看出,"as"關鍵字的使用的確使得變量進行了類型轉換。
class java.util.ArrayList
class [Ljava.lang.String;
看到了這個用法,我們可能會想,"as"關鍵字的這個用法是如何實現的?我們如何想把自己設計的兩個類之間進行相互轉換,該如何實現。
比如說我們有如下的兩個類:
class A
{
def x
}
class B
{
def x
}
如果我們已經得到了一個A類的對象,如下:
def a = new A(x:3)
那麼我們如何通過下面的語句獲取到一個B類的對象呢?
def b = a as B
其實,很簡單,我們只需要在A類裡實現"asType"方法即可,如下所示:
class A
{
def x
Object asType(Class type)
{
if(type == B) return new B(x:this.x+1)
}
}
這是我們重寫過的A類,那麼我們現在就可以測試看看我們是否實現了上面所希望的功能:
def a = new A(x:3)
def b = a as B
println b.class.simpleName
println b.x
運行結果為:
B
4
可以看到,的確是實現了我們預想的功能。
除此之外,"as"關鍵字還有讓我們驚奇的發現。比如,我們有如下的一個簡單類:
class C
{
def x
def y
public C(x,y)
{
this.x = x
this.y = y
}
}
那麼,我們可以這樣實例化它的一個實例:
def list = [1,2]
def c = list as C
println c.class.simpleName
println "${c.x},${c.y}"
運行的結果為:
C
1,2
這真是如魔幻一樣。
且慢驚歎,再跟著我們看看下面的例子,比如,我們定義了如下的一個接口:
interface D
{
def test_d()
}
我們就可以這樣使用"as"關鍵字:
def map = [test_d:{println 'ok'}]
def d = map as D
println d.class.simpleName
d.test_d()
運行結果為:
$Proxy0
ok
真的是很酷吧!我們可以看到,"as"關鍵字是Groovy語言中是一個很重要的關鍵字,它的用法體現了Groovy語言作為一個動態語言的特點,一切都可以在運行期內在做決定,充分的展現了Groovy語言靈活、快捷的特點。