【问题标题】:Groovy Attribute should have type 'java.lang.Integer', but found type 'java.lang.Object'Groovy 属性应具有类型“java.lang.Integer”,但找到类型“java.lang.Object”
【发布时间】:2015-06-22 02:14:52
【问题描述】:

我有以下 JUnit 测试:

public class JavaTest {

    final int value = 2;

    @Test
    @Repeat(times = value)
    public void test() {
        fail("Not yet implemented");
    }
}

@Repeat注解来自easytest-core,准确定义为here

当我将它编译为 java 源代码时,一切构建(和运行)都很好。当我编译与 groovy 源代码完全相同的东西时,我得到:

Groovy:属性 'times' 应该具有类型 'java.lang.Integer';但在@org.easetech.easytest.annotation.Repeat GroovyTest.groovy 中找到了“java.lang.Object”类型

在网上搜索后,我在SOjira.codehaus上发现了一些类似的讨论,但都是针对String-GString问题的,所以解决方案对我不起作用。

我该如何解决这个问题?

更新

  • java.version=1.7.0_76
  • groovy.version=2.3.7

【问题讨论】:

  • 你试过用final Integer代替final int吗?
  • @tim_yates 我现在有。 :p Groovy 报告了同样的问题。 Java 现在报告“类型不匹配:无法从 Integer 转换为 int”。
  • 它在哪里报告? final...times=?
  • @cfrick 错误出现在@Repeat(times = value) 行。
  • 作为一个实验,您可以尝试将@CompileStatic 添加到课程中。

标签: groovy annotations junit4


【解决方案1】:

认为你遇到了一个事实,groovyc 不像 javac 那样将 final 变量视为内联常量

我尝试像这样更改您的 int 变量:

final Integer value = Integer.valueOf(2).intValue()

防止变量被视为内联常量。在那次更改之后,我从 @Repeat 注释中得到一个编译错误:

预期 Integer.valueOf(2).intValue() 为内联常量

似乎在 Groovy JIRA 中承认了这里的不一致:https://issues.apache.org/jira/browse/GROOVY-1628

在这个 SO 线程中还有一些进一步的讨论: Does it make sense to mark variable as final in groovy?

您似乎无法通过 groovy 来匹配此场景的 Java 行为。

【讨论】:

  • 无赖。那个 jira 票说 something 在 2.5.0 版本中已修复,但 Maven Central 说最后发布的是 2.4.3。
猜你喜欢
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 2013-06-09
  • 2016-06-17
  • 2013-11-22
  • 2021-07-26
相关资源
最近更新 更多