隐式转换无效

5
为什么不使用以下隐式方法?如何在作用域内有隐式的 Conversion[X,Y] 的情况下自动将X的实例转换为Y的实例?
为什么不应该使用以下隐式方法?如何能够在存在一个隐式转换Conversion [X,Y]的情况下,自动地将X的实例转换成Y的实例呢?
trait Conversion[X, Y] {
  def apply(x: X): Y
}
implicit object Str2IntConversion extends Conversion[String, Int] {
  def apply(s: String): Int = s.size
}
implicit def convert[X, Y](x: X)(implicit c: Conversion[X, Y]): Y = c(x)

val s = "Hello"
val i1: Int = convert(s)
val i2: Int = s // type mismatch; found: String  required: Int

1
为了让最后一行代码生效,你需要一个从 String 转换成 Int 的隐式转换,例如 implicitly[String => Int],但这并不存在。问题在于 Y 是一个参数,Scala 不会自动将其替换为你所寻找的类型。例如,implicit def convert[X](x: X)(implicit c: Conversion[X, Int]): Int = c(x) 将可行。 - 0__
1个回答

4
让你的转换扩展Function1,这样你就不需要辅助方法了:
trait Conversion[X, Y] extends (X => Y) {
  def apply(x: X): Y
}

// unchanged
implicit object Str2IntConversion extends Conversion[String, Int] {
  def apply(s: String): Int = s.size
}

// removed convert

// unchanged
val s = "Hello"
val i1: Int = convert(s)
val i2: Int = s

1
好主意!谢谢。但第一个问题仍然存在:为什么我的代码不起作用? - Peter Schmitz
@PeterSchmitz 可能是因为泛型返回类型取决于隐式类型。如果你将 Y 替换为 Int,你的代码就可以工作了。 - gzm0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接