Groovy 2.3.2和IntelliJ IDEA 13.1.4
考虑以下示例:
1。
@TypeChecked
class ImmutabilityUtils {
static List<Map<String, String>> asImmutable(List<Map<String, String>> relatedFeed) {
relatedFeed*.asImmutable().asImmutable()
}
}
在以上示例中,在带有消息的第一个
relatedFeed*.asImmutable().asImmutable()
调用下,用红色对asImmutable()
行加下划线:类别方法'asImmutable'不能与java.util.List >
奇怪的事情要注意-以前我在传递结果时作为内联函数进行了完全相同的内联,因为构造函数自变量IDE没有抱怨。就像是:
new FeedProcessor(relatedFeed*.asImmutable().asImmutable())
构造器定义如下所示:
FeedProcessor(List<Map<String, String>> relatedFeed)
...不是IDE抱怨的情况。
2。
@TypeChecked
class ImmutabilityUtils {
static Map<String, Map<String, String>> asImmutable(Map<String, Map<String, String>> lookupFeed) {
lookupFeed.collectEntries { [it.key, it.value.asImmutable()] }.asImmutable()
}
}
为简化起见,这里的情况与第一个示例完全相同。唯一的不同是,加下划线的
asImmutable()
方法调用是该行结尾处的调用(在闭包的大括号关闭之后)。 IDE的消息是类别方法“asImmutable”不能与java.util.Map 相加
与第一个示例类似,当作为构造函数参数内联执行时,没有抱怨。
3。
@Builder(buildMethodName='build', builderMethodName='builder', prefix='with')
class Whatever { ... }
在这里,
@Builder
批注本身带有消息下划线缺少的属性:forClass,builderClassName
这是错误的,例如,不能同时使用forClass和builderMethodName。
IntelliJ中的任何红色下划线都意味着代码甚至无法编译。它可以按预期进行编译和工作-既可以由IDE本身也可以由IDE外部的Gradle进行编译。
为什么IntelliJ抱怨正确的东西?
最佳答案
红色下划线不一定表示代码不会编译。这意味着IntelliJ自己的代码分析认为存在错误,但这并不总是正确的-特别是对于Java以外的语言。 IntelliJ的Groovy支持很好但是并不完美,它对于新的@TypeChecked
模式可能还不够好,并且它可能根本不了解较小/最新的AST转换(例如@Builder
)(在这种情况下,它不会理解它们) )。
在这种情况下,正确的措施是在IntelliJ的bug tracker中提出问题-不仅出于您自己的利益,而且也出于整个Groovy社区的利益。