【问题标题】:scala method name as variable name [duplicate]scala方法名称作为变量名称[重复]
【发布时间】:2015-04-21 02:26:40
【问题描述】:

我想定义 case class demo(notify: String),但我的 IDE (IntelliJ IDEA) 抱怨“通知无法覆盖最终成员”。

我知道notifyAnyRef 的成员方法,IDE 可能会将变量名与方法名混淆。我需要一个notify 字段,我该怎么做?

【问题讨论】:

  • 你为什么不能叫它不同的名字? _notify 会起作用。
  • 我正在使用jackson从案例类映射到json,因为json的结构不能改变(其他服务会消耗json数据),我必须使用notify字段在我的案例中类。
  • 您可以使用jackson-annotations 自定义映射,这样您就不需要具有与JSON 中完全相同名称的值。它会变成case class demo(@JsonProperty("notify") notify_: String)
  • 谢谢@Jesper,这正是我需要的

标签: scala


【解决方案1】:

这不是 IDE 的问题。 Scala 类不能有冲突的符号,无论它们是方法还是字段。例如,以下代码不会编译:

class Foo {
    val bar = 1
    def bar() = "bar"
}

notify 是在AnyRef 上定义的,而且它是final,所以你在这里真的没有什么好的选择!

当然,您可以为变量命名不同的名称:

case class Foo(_notify: String)

如果你坚持变量名,你也可以扩展AnyVal,但前提是你只有一个val参数:

case class Foo(notify: String) extends AnyVal

您可能正在寻找允许您使用重音符转义关键字的功能:

case class Foo(`val`: String)

这将允许您使用关键字(以及其他一些通常非法的变量名)作为变量名。这不适用于您的示例,因为 notify 不是关键字 - 它是类中已使用的符号!

您还可以提出一个解决方案,其中notify 对类是私有的,但这不适用于案例类或最合理的用例。

【讨论】:

  • case class Foo(notify: String) extends AnyVal 也不起作用。我期待使用关键字作为变量名,只需添加“关键字”
  • @vincentchou 我添加了一个解释如何转义关键字的编辑。另外,AnyVal 不起作用是什么意思?
  • 感谢您的回答,但@Jesper 已经解决了我的问题。我认为 scala 会提供某种机制来允许我们使用 notifytoString 作为变量名,但它没有。 @Jesper 通过利用 jackson 注解提供了另一种思想特征,这在处理这个问题时非常方便。
  • @vincentchou 好的——那么您应该回答自己的问题,并将其标记为已解决!下次,请确保在上下文中提出您的问题,以便读者可以更好地帮助解决问题。 XY 问题的经典版本——你问如何命名变量notify,但你真正想要的是一种以某种方式序列化对象的方法! meta.stackexchange.com/questions/66377/what-is-the-xy-problem
【解决方案2】:

忽略您的用例,一个名为 notify 的字段:

scala> class X(private[this] val notify: Int) { def f = notify * 2 }
defined class X

scala> new X(5).f
res1: Int = 10

scala> :javap -prv X
Binary file X contains $line6.$read$$iw$$iw$X
[snip]
{
  private final int notify;
    flags: ACC_PRIVATE, ACC_FINAL

  public int f();
    flags: ACC_PUBLIC
[snip]

【讨论】:

  • 我知道类的构造函数可以有notify,但是jackson不能序列化它
猜你喜欢
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多