Я пишу тип для преобразования между типами, и я замечаю что-то необычное с методом unapply на неявных объектах. Конкретноscala StackOverflow на неявном объекте unapply
object IntString extends PartialFunction[String, Int] {
def isDefinedAt(x: String) = Try(x.toInt).isSuccess
def apply(v1: String) = v1.toInt
def unapply(a:String):Option[Int] = if(this.isDefinedAt(a)) Some(this.apply(a)) else None
}
val s = "1000"
val IntString(i) = s
работает отлично, но
implicit object IntString extends PartialFunction[String, Int] {
def isDefinedAt(x: String) = Try(x.toInt).isSuccess
def apply(v1: String) = v1.toInt
def unapply(a:String):Option[Int] = if(this.isDefinedAt(a)) Some(this.apply(a)) else None
}
val s = "1000"
val IntString(i) = s
дает StackOverflow по методу apply
. Я хотел бы быть в состоянии иметь объект быть неявным, так что я могу сделать что-то вроде
def parse[A,B](a:A)(implicit ev:PartialFunction[A,B]) = ev(a)
в дополнение к явно применяются/исключить его.
Спасибо! Это очень четкое объяснение происходящего. Я думал, что произошла какая-то неожиданная неявная хитрость, но я не был уверен, что. Я действительно хочу продолжать расширять 'PartialFunction' (у моей фактической реализации есть класс, который расширяет ее), чтобы я мог делать такие вещи, как' orElse' и 'andThen', но на основании вашего ответа я изменил' v1.toInt' на 'Integer.parseInt (v1)' и он сработал. –