2016-09-21 133 views
0

强调了输入参数时,我有一个其中包含在那里我试图定义默认实现为“空”的方法一般参数trait接受“缺少的参数类型”使用的功能文字

trait MetaBase[T <: Throwable] { 
    ... 
    def riskWithEvent[V](
    vToEvaluate: => V, 
    failureTEvent: FailureBase[T, V] => Unit = _ =>() 
): TryBase[T, V] = 
    ... 
} 

failureTEvent: FailureBase[T, V] => Unit =之后在下划线收到“缺少的参数类型”的错误。我无法弄清楚如何让Scala编译器不必知道当前的类型信息,因为它没有被使用或需要。

我考虑改变参数:

failureTEvent: Option[FailureBase[T, V] => Unit] = None 

不过,我不喜欢这样的客户现在必须包裹它们的功能在Some()。我更愿意让他们不指定参数,或者指定没有包装器的参数。

对此有何指导意见是极大的赞赏。

+1

也许有FailureBase的变化做。无论如何,你都可以使用(_:Any)=>()。 –

+1

默认ARGS可能有其他危害:https://issues.scala-lang.org/browse/SI-7095 –

+0

的'(_:任意)=>()'编译(我还有很多其他的代码来获得重构然后我可以声称它的工作)。我很困惑,为什么下划线本身并不意味着同一件事;即Scala编译器生成的任何代码基本上应该是您确定的显式形式。值得与Scala编译器团队打开一张票吗? – chaotic3quilibrium

回答

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,因为函数是禁忌变参数:

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

https://issues.scala-lang.org/browse/SI-7095

Scala case class.type does not take parameters

+0

优秀的答案! Tysvm如此彻底。我知道你已经把它放在原帖的评论中了,但是......你是否介意在你的答案(底部,如果你喜欢)中加一个旁注来说明你打开的票子来覆盖这个?这意味着阅读答案的人将拥有所需的所有上下文,以了解为什么他们在这个切线上,并且将来可能会根据票证在Scala编译器中进行修复。 Tysvm。 – chaotic3quilibrium

相关问题