Scala调用test函数时自定义List与标准库List类型不匹配报错
错误原因
- 核心是命名冲突:你自定义的
List特质和Scala默认全局导入的scala.collection.immutable.List重名,两个是完全独立、无继承关系的不同类型。 - 你定义
test函数时声明的入参List[Int],编译器默认匹配当前上下文你自己写的自定义List类型;但你创建val example3 = List(1,2,3,4,5)时,编译器默认调用标准库List的伴生对象构造实例,所以生成的是标准库List类型,和入参要求的自定义List类型不匹配。 - 报错信息里的
List(in class $iw)[Int]就是指代当前代码作用域下你自定义的List类型。
解决方案
- 方案1:用你自定义的List实现类直接构造实例:
val example3 = Cons(1, Cons(2, Cons(3, Cons(4, Cons(5, Nil))))) - 方案2:隐藏标准库的List导入,避免命名冲突,在代码文件最开头添加:
import scala.collection.immutable.{List => _, _} - 方案3:创建变量时显式标注类型,让编译器优先匹配符合类型的构造方式:
val example3: List[Int] = List(1,2,3,4,5)
注意:如果你还没有实现自定义
List伴生对象的多参数apply方法,即使解决了命名冲突,直接调用List(1,2,3,4,5)也会报错,需要先补全伴生对象的构造逻辑,示例如下:object List { def apply[A](elems: A*): List[A] = { if (elems.isEmpty) Nil else Cons(elems.head, apply(elems.tail: _*)) } }
内容的提问来源于stack exchange,提问作者Linna
相关产品推荐
相关产品推荐

