防止在Scala中隐式调用0-ary函数

时间:2017-09-19 20:50:54

标签: scala implicit-conversion code-standards

我被一个生产错误所困,在那里我将一个不纯的0元函数传递给了一个错误地期望一个裸结果类型的类。

def impureFunc(): Future[Any] = ???

case class MyService(impureDependency: Future[Any] /* should have been () => Future[Any] */)

实际上,这使MyService立即调用impureFunc并缓存程序生命周期的第一个结果,这导致了一个非常微妙的错误。

通常,类型系统会阻止这类错误,但由于能够在没有参数列表的情况下调用0-ary函数,编译器会接受此程序。

显然,这是Scala的“功能”,旨在使代码看起来更干净,但这是一个糟糕的问题。有没有办法使这成为编译器警告或linting错误?换句话说,拒绝implicit method conversion的“空应用程序”类型?

1 个答案:

答案 0 :(得分:3)

根据此处的评论,此行为似乎是deprecated with a warning in 2.12,并且应该在2.13中成为错误。因此,似乎答案是在升级后使用-deprecation -Xfatal-warnings