这很可能是一个愚蠢的问题,我在这里看到了答案,但似乎在我的特定情况下不起作用。这是我的代码
object ProductAdded{
val PRODUCT_NAME:String="productName"
val PRODUCT_PRICE:String="productPrice"
}
class ProductAdded @JsonCreator()(@JsonProperty(PRODUCT_NAME) var productName: String,
@JsonProperty(PRODUCT_PRICE) var productPrice: String) extends Event {
@JsonProperty(PRODUCT_NAME) def getProductName: String = {
productName
}
@JsonProperty(PRODUCT_PRICE) def getProductPrice: String = {
productPrice
}
}
我试图在构造函数中使用这些常量,但是当我编译时显示此错误
Error:(12, 49) annotation argument needs to be a constant; found: event.ProductAdded.PRODUCT_NAME
class ProductAdded @JsonCreator()(@JsonProperty(PRODUCT_NAME) var productName: String,
答案 0 :(得分:4)
这是一个非常不幸的错误信息,我必须说,因为Scala实际上并没有一个名为“常量”的概念,所以如果你甚至不知道它是什么,你应该怎么做一些“常数”是
Scala 但是有一个概念“constant expression”(粗略强调我的):
6.24常量表达式
常量表达式是Scala编译器可以计算为常量的表达式。 “常量表达式”的定义取决于平台,但它们至少包括以下形式的表达式:
- 值类的文字,例如整数
- 字符串文字
- 使用
构建的类Predef.classOf
- 来自底层平台的枚举元素
- 一个文字数组,格式为Array(c 1 ,...,c n ),其中所有c i 都是本身就是常量表达式
- 由常量值定义 定义的标识符。
和“constant value definition”(粗体强调我的):
常量值定义的格式为
final val x = e
其中
e
是常量表达式。 必须存在final
修饰符且不能给出类型注释。
因此,正如您所看到的,您的表达式不是常量值表达式,因为该定义不是常量值定义。
要将其转换为常量值定义,您需要
: String
final
修饰符 :即使单身object
的成员隐式 final
,常量值定义需要显式注释结果看起来像这样:
object ProductAdded {
final val PRODUCT_NAME = "productName"
final val PRODUCT_PRICE = "productPrice"
}
class ProductAdded @JsonCreator()(
@JsonProperty(PRODUCT_NAME) var productName: String,
@JsonProperty(PRODUCT_PRICE) var productPrice: String
) extends Event {
@JsonProperty(PRODUCT_NAME) def getProductName = productName
@JsonProperty(PRODUCT_PRICE) def getProductPrice = productPrice
}