天天看點

Scala入門到精通——第二十八節 Scala與JAVA互操作

java中調用scala類

scala中調用java類

scala類型參數與java泛型互操作

scala與java間的異常處理互操作

java可以直接操作縱scala類,如同scala直接使用java中的類一樣,例如:

對!就是這麼簡單,java似乎可以無縫操縱scala語言中定義的類,在trait那一節中我們提到,如果trait中全部是抽象成員,則它與java中的interface是等同的,這時候java可以把它當作接口來使用,但如果trait中定義了具體成員,則它有着自己的内部實作,此時在java中使用的時候需要作相應的調整。我們先看下trait中全部是抽象成員的情況,例如:

那如果trait中包括了具體的成員,此時又該怎麼使用呢?此時需要作特殊處理,代碼如下:

用javap指令檢視帶具體成員方法的trait mysqldao時,其代碼是一樣的

這篇文章中給出了下面這樣一個trait的定義:

它生成下面兩個位元組碼檔案mytrait.class、mytrait$class

這種方式進行方法的實作,即mysqldao$class是個抽象類,該抽象類中包含了mysqldao中實作的方法。也即

最終反編譯後的代碼應該具有以下形式:

值得注意的是在scala ide for eclipse中不能實作下列代碼的調用

隻有在intellij idea中才能正确使用,從這點上也說明了intellij idea在編寫scala應用程式時更貼近實際。

scala可以直接調用java實作的任何類,隻要符合scala文法就可以,不過某些方法在java類中不存在,但在scala中卻存在操作更簡便的方法,例如集合的foreach方法,在java中是不存在的,但我們想用的話怎麼辦呢?這時候可以通過隐式轉換來實作,scala已經為我們考慮到實際應用場景了,例如:

此時隻要引入scala.collection.javaconversions._包就可以了,它會我們自動地進行隐式轉換,進而可以使用scala中的一些非常友善的高階函數,如foreach方法,代碼如下:

前面我們使用的是隐式轉換,我們還可以顯式地進行轉換,例如:

下面給出的是scala集合與java集合支援的轉換操作(取自javaconversions源碼):

java中的泛型可以直接轉換成scala中的泛型,在前面的課程中我們已經有所涉及,例如java中的<code>comparator&lt;t&gt;</code> 可以直接轉換成 scala中的<code>comparator[t]</code> 使用方法完全一樣,不同的隻是文法上的。下列代碼給出了其使用方法:

下面的代碼示範了java是如何使用scala中的泛型的:

通過上述代碼,我們已經十厘清楚了scala中的泛型如何與java中的泛型進行互操作了,但還有一個問題值得去考慮,那就是java中的通配符的泛型如何與scala中的泛型進行操作呢?例如:

java中的異常處理具有如下形式:

scala中的異常處理是通過模式比對來實作的,代碼如下:

上面給的例子是scala如何捕獲java中抛出的異常,下面的例子給出的是java如何捕獲scala中聲明的異常,代碼如下:

通過本節,我們基本能掌握scala與java的互操作,當然這裡面還有很多内容沒有涉及,但在日常開發工作當中,掌握本節講的内容便可以應付絕大多數互操作問題。

添加公衆微信号,可以了解更多最新spark、scala相關技術資訊

Scala入門到精通——第二十八節 Scala與JAVA互操作