Я понимаю, почему вы ожидаете, что это сработает, но, очевидно, средство вывода типов не использует возвращаемый тип для вывода T
. Я бы тоже этого ожидал.
Что касается неоднозначности, CanBuildFrom
позволяет избежать двусмысленности, просто не определяя все на одном и том же "уровне". Например, это решает проблему неоднозначности:
trait LowPriorityImplicits {
implicit object url extends UrlLike[URL]{def url(s: String) = new URL(s)}
implicit object uri extends UrlLike[URI]{def url(s: String) = new URI(s)}
}
object UrlLike extends LowPriorityImplicits {
implicit object str extends UrlLike[String]{def url(s: String) = s}
}
Однако, не заставит вывод типа работать так, как вы хотите:
scala> res0.url : URL
<console>:16: error: type mismatch;
found : String
required: java.net.URL
res0.url : URL
^
Что указывает на то, что оно, очевидно, делает T
логический вывод без учета типа возвращаемого значения.