为什么在隐式def中为varargs传递单个子类型会导致类型不匹配?

时间:2018-02-14 07:27:27

标签: scala implicit

给出以下代码片段

sealed trait A
case class B() extends A

object Creator {
  def apply(plus: Plus) = plus()
}

sealed trait Plus {
  def apply(): Int
}

object Plus {
  implicit def supersWrapper(supers: A*) = // Changing this to just A works
    new Plus {
      def apply(): Int = 5
    }
}

我收到以下错误

scala> Creator(B())
<console>:12: error: type mismatch;
found   : B
required: Plus
Creator(B())

如果我将超级类型更改为A,我会得到以下内容

scala> Creator(B())
res9: Int = 5

为什么我得到上述行为?我知道我可以为A和A *定义两个隐式defs,但我想知道为什么我需要这样做。

1 个答案:

答案 0 :(得分:0)

隐式转换函数始终只能应用于一个参数。因此implicit def supersWrapper(supers: A*)没有意义,但scalac不会为此生成警告。