ScalaShi用FastJson报错:对重载方法的歧义应用的错误
完整的报错信息如下:
Error:(24, 28) 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,String]) and expected result type String
val str: String = JSON.toJSONString(map)
目的:想将map类型转换为String类型
代码如下:
val map: Map[String, Int] = Map("a" -> 1, "b" -> 2, "c" -> 3)
val mapStr: String = JSON.toJSONString(map)
println(mapStr)
报错原因:
因为JSON对象里面有很多toJSONString的重载方法:
第一个和第二个方法中,两个方法的第一个传入参数都是相同的,区别在于第二个传入的参数。可以看到第二个方法当中传入的参数是一个可变长度的参数。所以我的猜测就是因为这个可变长度的参数导致scala的编译器认为这两个方法都可以传入一个参数。所以报出了重载方法定义不明确的错误。
解决方案:
在这个代码当中,我想要调用的是第一个toJSONString的方法。可以看到里面实际上只有一行代码
return toJSONString(object,emptyFilters)
emptyFilter的参数,我用ctrl+鼠标左键进行了追踪,发现它是这样定义的;
所以,我这里调用的代码改一下就好了:
val map: Map[String, Int] = Map("a" -> 1, "b" -> 2, "c" -> 3)
val mapStr: String = JSON.toJSONString(JavaConverters.mapAsJavaMapConverter(map).asJava,new Array[SerializeFilter](0))
println(mapStr)
结果如下:
{"a":1,"b":2,"c":3}
就不会报错了!
最后:
如果有哪里写得不对,请在下方讨论,谢谢!