【问题标题】:Scala compiler throws annotation argument needs to be a constant error on constant argumentScala编译器抛出注释参数需要是常量参数上的常量错误
【发布时间】:2016-05-28 18:45:10
【问题描述】:

我正在使用 Spark-SQL 附带的以下注释参数:

@SQLUserDefinedType(udt = ActionUDT.CLAZZ)
trait Action extends ActionLike {
...implementation
}

其中ActionUDT.CLAZZ 定义为常量 val:

object ActionUDT extends ActionUDT {
  final val CLAZZ: Class[_ <: ActionUDT] = this.getClass
}

但我得到以下编译器错误:

Error:(25, 37) annotation argument needs to be a constant; found: ActionUDT.clazz
@SQLUserDefinedType(udt = ActionUDT.clazz)
                                    ^

为什么会产生这样的误报?它是一个错误吗?我正在使用 Scala 2.10.5

【问题讨论】:

    标签: scala annotations


    【解决方案1】:

    当注释中需要Class[_] 类型的参数时,使用classOf[] 对我有用。你的情况可以试试

    @SQLUserDefinedType(udt = classOf[ActionUDT])
    

    【讨论】:

      【解决方案2】:

      刚刚遇到这个问题。事实证明,scaladoc 甚至没有尝试查看给定的表达式是否最终返回一个常量。所以在我的情况下,错误是:

      error: annotation argument needs to be a constant; found "someString1".+("someString2")
      

      在代码中,这只是连接someString1someString2。 .更改代码以便根本没有字符串连接解决了问题。

      【讨论】:

        【解决方案3】:

        class 不是此处定义的常量对象。常量是 .. 嗯 .. 一个常量,如数字或字符串字面量。

        【讨论】:

          猜你喜欢
          • 2021-06-11
          • 2020-10-04
          • 1970-01-01
          • 2021-12-07
          • 1970-01-01
          • 1970-01-01
          • 2022-11-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多