我想定义case class demo(notify: String)
,但我的IDE(IntelliJ IDEA)抱怨“通知无法覆盖最终成员”。
我知道notify
是AnyRef
的成员方法,IDE可能会混淆方法名称的变量名称。我需要一个notify
字段,我该怎么做?
答案 0 :(得分:6)
这不是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
是私有的,但不能使用案例类或最合理的用例。
答案 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]