两个问题:
1)为什么在BaseTrait函数中不能包含这两个apply方法(注意,当它们使用两个参数取消执行时,它是有效的)?
2)我怎样才能实现这个功能:多个应用方法是curried的?
trait BaseTrait[T, U] {
def name: String
def tryMe(record: T): Option[U]
}
object BaseTrait {
// can't have both apply methods when curried
def apply[T](s: String)(f: T => Option[Long]): LongTrait[T] =
new LongTrait[T] {
override val name: String = s
override def tryMe(record: T): Option[Long] = f(record)
}
def apply[T](s: String)(f: T => Option[Boolean]): BooleanTrait[T] =
new BooleanTrait[T] {
override val name: String = s
override def tryMe(record: T): Option[Boolean] = f(record)
}
}
trait LongTrait[T] extends BaseTrait[T, Long] {
override def tryMe(record: T): Option[Long]
}
trait BooleanTrait[T] extends BaseTrait[T, Boolean] {
override def tryMe(record: T): Option[Boolean]
}它编译得很好,但抛出了一个运行时错误:
scala> BaseTrait("test") { s: String => Option(s.toBoolean) }
<console>:13: error: ambiguous reference to overloaded definition,
both method apply in object BaseTrait of type [T](s: String)(f: T =>
Option[Boolean])BooleanTrait[T]
and method apply in object BaseTrait of type [T](s: String)(f: T =>
Option[Long])LongTrait[T]
match argument types (String)
BaseTrait("test") { s: String => Option(s.toBoolean) }发布于 2017-12-16 11:14:55
如果颠倒当前参数的顺序,使它们在第一个参数中不同,则可以成功调用apply方法。
object BaseTrait {
// can't have both apply methods when curried
def apply[T](f: T => Option[Long])(s: String): LongTrait[T] =
new LongTrait[T] {
override val name: String = s
override def tryMe(record: T): Option[Long] = f(record)
}
def apply[T](f: T => Option[Boolean])(s:String): BooleanTrait[T] =
new BooleanTrait[T] {
override val name: String = s
override def tryMe(record: T): Option[Boolean] = f(record)
}
}
BaseTrait { s:String => Option(s.toBoolean) }("test")
res58: BooleanTrait[String] = ammonite.$sess.cmd57$BaseTrait$$anon$2@e39317d正如评论中提到的,this appears to be a corner case in the language。在引用的问题中,以习惯修复状态关闭,以下更简单的代码也显示了相同的模糊引用问题。
object Foo {
def bar(i: Int) = println(i)
def bar(i: Int) (f: Float) = println(i*f)
}根据Scala语言的创建者Martin Odersky的说法,
“我刚刚在上面写过,在规范中没有这样做的企图。我挑战你给出一套完整的和可决定的规则来做到这一点。”
因此,由于实现必要检查的困难,即使这些方法不能随后被引用,也不可能阻止它们的编译。
https://stackoverflow.com/questions/47841866
复制相似问题