Groovy探索 “as”關鍵字的深入使用

                 Groovy探索 "as"關鍵字的深入使用

 

 

在前面的系列《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語言靈活、快捷的特點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章