【发布时间】:2019-04-25 06:46:40
【问题描述】:
在 scala REPL 中使用 scala 2.10。我有两个myf 的定义,它们使用不同的参数类型重载。但是当我调用myf(第7行)时,它调用def myf(data:List[Int])而不是def myf(data:List[String])。尽管参数本身的类型是dataString:List[String]。
如何在myf(data:List[Int]) 中调用myf(data:List[String])?
我尝试使用(implicit d: DummyImplicit) 处理类型擦除,如here 所示
def myf(data:List[String]) : Unit = {
data.foreach(println)
}
def myf(data:List[Int])(implicit d: DummyImplicit) : Unit = {
val dataString:List[String] = data.map(_ + 1000).map(_.toString) // do something else before toString
myf(dataString:List[String]) // want to call myf(data:List[String]), does not want to call myf(data:List[Int])
}
val d:List[Int] = List(1,2,3)
myf(d)
错误:
Name: Compile Error
Message: <console>:50: error: type mismatch;
found : List[String]
required: List[Int]
myf(dataString:List[String]) // want to call myf(data:List[String]), does not want to call myf(data:List[Int])
【问题讨论】:
-
为什么? “鉴于 JVM 的限制,为什么要尝试模拟永远无法正常工作的东西?”为什么不给这两个函数两个不同的名字呢?基于参数类型的重载已经够变幻无常了,尤其是类型擦除。痛苦到底是为了什么?
-
这不会在 REPL 或 IntelliJ 工作表中运行,因为每个编译单元都包含在自己的
object中。因此myf()的第二个定义掩盖了第一个。您的代码在包装在object中时运行良好,使整个代码成为具有myf()的 2 个定义的编译单元。 -
我确实在 REPL 中运行
-
@jwvh 我尝试使用 main() 方法在 .scala 文件中编写相同的代码,它给出了相同的编译错误..
-
@SidaZhou;我能够以各种方式运行您的代码,而无需更改: 1-通过
:paste按原样粘贴到 REPL 中。 2-在 IDE 工作表中的object内。 3-在object的.scala文件中。在最后一种情况下,只有最后两行发布的代码进入main()方法。
标签: scala