例如我有一堂课Value和一个隐式函数将字符串转换为值:
case class Value(v: String)
implicit def strToValue(s: String): Value = Value(s)
这是一个有方法返回值的特征:
trait ReturnValue {
def f: Value
}
因为存在隐式转换,所以我可以实现方法f只需返回一个字符串文字:
object Obj1 extends ReturnValue {
override def f: Value = "123"
}
当然,返回 String 类型的变量也可以正常工作:
object Obj2 extends ReturnValue {
override def f: Value = {
val v = Some("123").getOrElse("234")
v
}
}
但是当我尝试直接使用 Option.getOrElse 的结果作为返回值时:
object Obj3 extends ReturnValue {
override def f: Value = Some("123").getOrElse("234") // Compilation error: type mismatch
}
出现编译错误:
Error:(23, 50) type mismatch;
found : java.io.Serializable
required: Entry.Value
override def f: Value = Some("123").getOrElse("234") // Compilation error: type mismatch
看来这里的类型推断失败了。类型String没有推断出来,那么隐式转换就无法匹配。 (完整文件是here)
我尝试过其他具有类型参数的函数,例如“map”,它们都工作得很好。
为什么 Option.getOrElse 如此特殊以至于类型推断在这里失败?