scala编译异常ambiguous reference to overloaded definition

scala | 2019-09-13 10:02:39


1.异常

编译scala程序时出现异常

ambiguous reference to overloaded definition

异常代码行,调用阿里json jar

var resultJson=JSON.toJSONString(result)


2.原因

scala与java编译器重载逻辑不匹配


Java在编译时,首先会根据实参的数量和类型(这里是2个实参,都为int类型,注意没有转成int数组)来进行处理,也就是查找到calPrice(int price,int discount)方法,而且确认它是否符合方法签名条件。现在的问题是编译器为什么会首先根据2个int类型的实参而不是1个int类型、1个int数组类型的实参来查找方法呢?这是个好问题,也非常好回答:因为int是一个原生数据类型,而数组本身是一个对象,编译器想要“偷懒”,于是它会从最简单的开始“猜想”,只要符合编译条件的即可通过,于是就出现了此问题。


问题是阐述清楚了,为了让我们的程序能被“人类”看懂,还是慎重考虑变长参数的方法重载吧,否则让人伤脑筋不说,说不定哪天就陷入这类小陷阱里了。


Scala编译器的处理方式就比较“显式”了,直接抛出“ambiguous reference to overloaded definition” ERROR。


针对可变参数的方法重载机制,这是Scala的与java在编译处理上区别的地方。


Scala分辨重载方法的过程与Java极为相似。任何情况下,被选中的重载版本都是最符合参数静态类型的那个。有时如果不止一个最符合的版本;这种情况下编译器会给你一个“ambiguous reference to overloaded definition”(模糊引用了重载定义的方法)的错误。


3.解决方法

在scala代码中显式调用:toJSONString(Object object, SerializerFeature... features) 。

 var resultJson=JSON.toJSONString(result,SerializerFeature.PrettyFormat)

不推荐带有变长参数的方法重载,这让人不好理解,scala不能用。



登录后即可回复 登录 | 注册
    
关注编程学问公众号