scala 呼叫 java 方法引數匹配問題

破棉襖發表於2017-03-02

scala呼叫java的FastJson時發生了一個方法引數匹配問題:

scala和java幾乎沒有區別,可以互相呼叫。注意這裡說的是幾乎,總有那麼少數,出人意料的驚喜在告訴你,scala就是scala。

例子:


  1. import com.alibaba.fastjson.JSON


  2. var map:scala.collection.mutable.HashMap[String,Any] = scala.collection.mutable.HashMap()
  3. map += ("name" -> "wzx")
  4. map += ("age" -> 18)
  5. val javaMap = JavaConversions.asJavaMap(map)
  6. val jsonStr = JSON.toJSONString(javaMap)
上面程式碼是將map轉為json字串,但是編輯器會編譯不過,異常如下:

  1. ambiguous reference to overloaded definition, both method toJSONString in object JSON of type (x$1: Any, x$2: com.alibaba.fastjson.serializer.SerializerFeature*)String and method toJSONString in object JSON of type (x$1: Any)String match argument types (java.util.Map[String,Any])
FastJson程式碼:

  1.     public static String toJSONString(Object object) {
  2.         return toJSONString(object, emptyFilters, new SerializerFeature[0]);
  3.     }

  4.     public static String toJSONString(Object object, SerializerFeature... features) {
  5.         return toJSONString(object, DEFAULT_GENERATE_FEATURE, features);
  6.     }
錯誤的原因很明顯,編譯器在編譯scala呼叫java依賴包裡面的toJSONString函式時發生了歧義


java過載呼叫規則:
  • 呼叫方法時,能與固定引數函式以及可變引數都匹配時,優先呼叫固定引數方法。
  • 呼叫方法時,兩個變長引數都匹配時,編譯無法透過。
scala過載呼叫規則:
  • 呼叫方法時,scala首先會自己匹配,自己匹配不了的時候,使用者可以手動來標識變參引數

總結:
     scala呼叫java異常,可能是scala編譯器和java編譯器處理此問題的差異導致。




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29754888/viewspace-2134577/,如需轉載,請註明出處,否則將追究法律責任。

相關文章