如何将隐式类用作函数结果类型

时间:2016-12-29 10:49:06

标签: scala implicit

很长一段时间我都试图避免隐式课程,但最近我陷入了困境。目前我无法弄清楚为什么函数aFunc2的返回类型不能像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()

1 个答案:

答案 0 :(得分:1)

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

查看代码,我猜这个问题不是“隐式类”,而是你的类型不匹配的事实。

该行:

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

期望Experiment[K,V]类型的返回值同时由您的方法的调用方指定KV。 你要返回的是(Int, Double)类型的元组,所以编译器会抱怨。

如果要返回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的小数)。