scala方法名称作为变量名称

时间:2015-04-21 02:26:40

标签: scala

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

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

2 个答案:

答案 0 :(得分:6)

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

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

notifyAnyRef上定义,而且它是final,所以你在这里没有任何好的选择!

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

case class Foo(_notify: String)

如果您坚持使用变量名称,则还可以扩展AnyVal,但前提是您只有一个val参数:

case class Foo(notify: String) extends AnyVal

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

case class Foo(`val`: String)

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

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

答案 1 :(得分:1)

忽略您的用例,名为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]