如何使用隐式 class 作为函数结果类型

How to use an implicit class as a function result type

很长一段时间以来,我都试图避免隐式 类 但最近我陷入了其中。目前我不明白为什么我的函数 aFunc2 的 return 类型不能像 aFunc1.

中的参数那样转换成它的隐式形式
object SO extends App {
  implicit class Experiment[K, V](tpl: (K, V))(implicit o: Ordering[K], f: Fractional[V]) {
    def foo(): String = "Bar"
  }

  // Works
  println((12, 23.1).foo())

  // Works
  def aFunc1[K, V](e: Experiment[K, V]): String = e.toString
  println(aFunc1((12, 23.1)))

  // does not - why ?
  def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = (12, 23.1)

}

编辑 1:实际上这与类型有关,所以让我稍微扩展一下示例:

object SO extends App {
  implicit class Experiment[K, V](tpl: (K, V))(implicit o: Ordering[K], f: Fractional[V]) {
    def foo(): (K, V) = (tpl._1, tpl._2)
  }

  // Works
  println((12, 23.1).foo())

  // Works
  def aFunc1[K, V](e: Experiment[K, V]): String = e.toString
  println(aFunc1((12, 23.1)))

  // still does not  but K and V should actually match - i guess
  def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = e.foo()

}

错误:

Error:(19, 66) type mismatch;
 found   : (K, V)
 required: scratch.SO.Experiment[K,V]
  def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = e.foo()

如果没有您遇到的实际错误,很难猜测问题所在。您应该使用错误消息更新问题。

查看代码,我猜问题不在于 "implicit class",而是您的类型不匹配。

行:

def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = (12, 23.1)

期望类型 Experiment[K,V] 的 return 值是 KV 均由您的方法的调用者指定。 你 returning 是一个 (Int, Double) 类型的元组,所以编译器会报错。

如果你想 return 一个 Experiment[Int, Double] 那么你应该将函数定义修改为:

def aFunc2[K, V](e: Experiment[K, V]): Experiment[Int, Double] = (12, 23.1)

更新: 您可以尝试将 KV 的隐式约束添加到 aFunc2 的定义中吗? 它看起来应该类似于:

def aFunc2[K: Ordering, V: Fractional](e: Experiment[K, V]): Experiment[K, V] = e.foo()

你必须记住,为了将元组 (K,V) 转换为 Experiment[K, V],你需要在范围内有两个隐式值(K 的顺序和 V 的小数)。