Scala方法重载触发m1方法ambiguous reference编译错误的原因求解
歧义错误原因排查
你遇到的编译错误核心是Scala编译器在解析c.m1调用时存在两种合法的语法解释,无法自动选择,因此抛出歧义错误。
具体原因
你定义的trait T中存在两个同名重载方法:
- 带参方法:
def m1(str: String): Unit - 无参方法:
def m1: Unit
当你在main中执行c.m1调用时,编译器有两种合法的解析路径:
- 调用无参的
m1: Unit方法,直接执行方法体得到Unit类型结果 - 将带参的
m1(String)方法转换为函数值,得到String => Unit类型的函数对象,不会执行方法体
两种解析语法上都完全合法,编译器无法判断你的实际意图,因此报出ambiguous reference错误。
解决方案
你可以根据自己的实际需求选择任意一种方式消除歧义:
- 如果要调用无参
m1方法:可以将无参方法的定义改为带空括号的形式def m1(): Unit,调用时写c.m1()即可明确指向无参方法 - 如果要获取带参方法的函数值:可以明确标注变量类型,例如
val func: String => Unit = c.m1,编译器会自动匹配到带参方法
内容的提问来源于stack exchange,提问作者ash164
相关产品推荐
相关产品推荐

