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&lt; java.util.Map&lt; java.lang.String,java.lang.String&gt;&gt;
奇怪的是需要注意的事情 - 之前我在执行完全相同的内联操作时传递结果作为构造函数参数IDE没有抱怨。类似的东西:
new FeedProcessor(relatedFeed*.asImmutable().asImmutable())
其中constuctor定义如下:
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&lt;?,?&gt;
与第一个例子类似,当作为构造函数参数内联执行时没有抱怨。
3
@Builder(buildMethodName='build', builderMethodName='builder', prefix='with')
class Whatever { ... }
此处@Builder
注释本身带有消息的下划线
错过的属性:forClass,builderClassName
哪个错误,例如 forClass 和 builderMethodName 不能同时使用。
IntelliJ中的任何红色下划线表示代码甚至无法编译。它编译并按预期工作 - 既由IDE本身编译,也由IDE外部的Gradle编译。
为什么IntelliJ抱怨某些事情是正确的?
答案 0 :(得分:1)
红色下划线不一定意味着代码不会编译。这意味着IntelliJ自己的代码分析认为存在错误,但它并不总是正确的 - 特别是对于Java以外的语言。 IntelliJ的Groovy支持很好,但并不完美,它可能不适合新的@TypeChecked
模式,它可能没有关于较小/最近AST转换的特定知识,例如@Builder
完全(在这种情况下,它不会理解它们)。
在这种情况下,正确的行动是在IntelliJ的bug tracker中提出问题 - 不仅符合您自己的利益,而且符合整个Groovy社区的利益。