二つの質問適用されます。なぜ私は、彼らが非カリー化されているとき、それは動作しますが、ノート(apply
関数はカリー化されたときBaseTrait
コンパニオンオブジェクトでこれらの2つのapply
のメソッドを持つことができませんカレーは、形質コンパニオンオブジェクトに
1) 、2つの議論で)?
2)この機能を実現するにはどうすればよいですか?複数の適用方法がカレー化されていますか?
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) }
私はそれがコンパイルするバグだと思います。それはしないでください。 – Dima
@Dimaあなたは精巧にできますか? Scalaコンパイラは、Function1 [T、Option [Boolean]]とFunction1 [T、Option [Long]]を区別できますが、コンパイルされたJavaコードは区別できませんか?あなたが詳細を持っていれば興味があります。 – user451151