防止在Scala中隐式调用0-ary函数
发布时间:2020-12-16 18:37:18 所属栏目:安全 来源:网络整理
导读:我被一个生产错误所困,我把一个不纯的0元函数传递给了一个错误地期望一个裸结果类型的类. def impureFunc(): Future[Any] = ???case class MyService(impureDependency: Future[Any] /* should have been () = Future[Any] */) 实际上,这使得MyService立即调
我被一个生产错误所困,我把一个不纯的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的“空应用程序”类型? 解决方法
从这里的评论看来,这个行为似乎是
deprecated with a warning in 2.12,应该在2.13中成为一个错误.因此,似乎答案是在升级后使用-deprecation -Xfatal-warnings.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |