为Scala val / var / def插入推断类型注释

时间:2013-05-01 09:02:15

标签: scala types code-generation type-inference

目前,我在Scala类,特征和对象[1]中输入公共valvardef的类型注释 - 通过推断它们的类型是精神上的,或偶尔通过将鼠标悬停在Eclipse中的标识符上来找出表示编译器认为类型应该是什么[2]。如何自动添加这些类型注释?

添加显式类型的目的是“锁定”模板的公共成员的类型,这样如果开发人员将来以导致不兼容类型的方式更改成员的定义,除非他们故意更改类型注释,否则会出现编译时错误。

脚注:

[1],除非它们覆盖超类型中的成员,并且类型应该与被覆盖成员的类型相同,这通常是我的代码中覆盖的情况。

[2]这并不总是正确的;当涉及覆盖超类型成员的成员时,表示编译器似乎很弱。

7 个答案:

答案 0 :(得分:2)

在Kepler Eclipse 4.3更新的Scala IDE中有been implemented

在标识符上使用ctrl / cmd-1并选择"添加显式类型..."。

请参阅here

答案 1 :(得分:2)

对于在Mac上使用IDEA的用户,以下作品:

⌥ (Alt) + return

即,按住Alt键并按回车键/输入键。

然后选择"为值定义添加类型注释"。

答案 2 :(得分:1)

有一个功能请求快速修复在声明(scala-ide#1433)中插入推断类型,但尚未有任何贡献。

答案 3 :(得分:1)

这不是您问题的直接解决方案,但如果您对这些功能进行单元测试,那么您的测试将“强制执行”返回类型,并在有人更改返回类型时中断。

例如,在specs2中,它可能看起来像:

foo(arg1) must be equalTo Success

答案 4 :(得分:1)

另一个部分解决方案是scalastyle SBT插件(http://www.scalastyle.org/rules-0.2.0.html),它可以向您发出有关推断类型的公共成员的警告。

答案 5 :(得分:0)

在Eclipse中:将鼠标悬停在标识符上,单击以展开悬停,三击以选中全部,按Ctrl + C(或Cmd + C)进行复制,单击代码以删除悬停,单击返回到您的位置是,按Ctrl + V粘贴,然后最后删除所有错误/过度冗长/冗余的东西。

输入正确的类型可能会更快。

有没有人有更好的方法?

答案 6 :(得分:0)

使用IDEA Intellij 15:文件菜单>设置>编辑>意图

最小化意图并选择Scala>输入并确保选中“Toggle Type Annotation”。

然后当您选择(变量或函数)定义并按Alt + [Enter]时,它会询问您是否要插入推断类型 - 点击[回车]来执行此操作。

我知道这是两个击键,但它仍然比选择,复制和粘贴更好。