我有一个带有通用参数的trait
,其中包含一个方法,我尝试将默认实现定义为"空"。
trait MetaBase[T <: Throwable] {
...
def riskWithEvent[V](
vToEvaluate: => V,
failureTEvent: FailureBase[T, V] => Unit = _ => ()
): TryBase[T, V] =
...
}
我收到的&#34;缺少参数类型&#34; failureTEvent: FailureBase[T, V] => Unit =
之后右下角的错误。我无法弄清楚如何让Scala编译器在那时不必知道类型信息,因为它没有被使用或需要。
我考虑过将参数更改为:
failureTEvent: Option[FailureBase[T, V] => Unit] = None
但是,我不喜欢客户现在必须将其功能包装在Some()
中。我更倾向于允许它们不指定参数,或者在没有包装器的情况下指定参数。
非常感谢任何有关此事的指导。
答案 0 :(得分:3)
实际上,V
param会遇到问题。
以下是-Ylog:typer -Ytyper-debug
。
| | | | | |-- ((x$1) => ()) : pt=FB[T,?] => Unit BYVALmode-EXPRmode (site: value g in MB)
<console>:13: error: missing parameter type
trait MB[T <: Throwable] { def f[V](g: FB[T, V] => Unit = _ => ()): Unit = () }
^
| | | | | | \-> <error> => Unit
或者,
scala> case class FB[T, V](t: T, v: V)
defined class FB
这有效:
scala> trait MB[T <: Throwable, V] { def f(g: FB[T, V] => Unit = _ => ()): Unit = () }
defined trait MB
这不是:
scala> trait MB[T <: Throwable] { def f[V](g: FB[T, V] => Unit = _ => ()): Unit = () }
<console>:13: error: missing parameter type
trait MB[T <: Throwable] { def f[V](g: FB[T, V] => Unit = _ => ()): Unit = () }
^
或者只需要Any
,因为在arg中函数是反变量的:
scala> trait MB[T <: Throwable] { def f[V](g: FB[T, V] => Unit = (_: Any) => ()): Unit = () }
defined trait MB
与默认arg输入相关的其他链接:
https://issues.scala-lang.org/browse/SI-8884