如何从Scala的WartRemover工具修复产品类型推断错误

时间:2014-12-17 15:43:50

标签: scala scala-2.11 type-annotation

我使用WartRemover工具来避免Scala 2.11代码中可能出现的错误。

具体来说,我想知道如何解决" 产品类型推断" 错误。

查看repo文档,我只能看到失败的例子,但我想知道我是如何修复该错误的:

https://github.com/puffnfresh/wartremover#product

完成我的作业后,我最终得到了另一个链接,解释了如何修复类型推断失败错误https://blog.cppcabrera.com/posts/scala-wart-remover.html。我引用" 如果你看到下面的任何警告,修复通常就像提供类型注释一样简单"但我不明白这意味着什么。我真的需要一个具体的例子。

2 个答案:

答案 0 :(得分:5)

Product是一种非常抽象的高级类型,约束很少。当推断类型为Product时,通常表明您犯了错误。例如。如果你有:

List((1, "hi", 0.4f), (2, "bye"), (3, "aloha", 7.2f))

然后这将编译好,给你一个List[Product]。但是,就像推断Any时一样,这可能是一个错误 - 你可能意味着它是List[(Int, String, Float)]并且意味着在中间元组中有第三个条目。

如果你确实想要一个List[Product],你可以通过明确地给出type参数来避免收到警告:

List[Product]((1, "hi", 0.4f), (2, "bye"), (3, "aloha", 7.2f))

答案 1 :(得分:1)

类型注释只是显式指定类型,而不是让它留给类型推理系统来处理。

在这种情况下最简单的例子可以是:

val element = 2

目前推断类型为Int,如果您希望对指定Byte, Short, Long, Double等类型进行更多控制,则可以明确将类型指定为:

val element: Double = 2

公共方法也需要类型注释

  

在这些情况下,类型推断可能会破坏封装,因为它取决于内部方法和类详细信息

Source