使用scala 2.11.5对此进行了测试。考虑下面的代码
class C(private val x: Int) {
override def equals(obj: Any) = obj match {
case other: C => x == other.x
case _ => false
}
}
println(new C(5) == new C(5)) //true
println(new C(5) == new C(4)) //false
它将作为此Java(1.8)代码进行编译和工作
class C {
private int x;
public C(int x) {
this.x = x;
}
public boolean equals(Object obj) {
if (obj instanceof C) {
return ((C) obj).x == x;
}
else {
return false;
}
}
}
System.out.println(new C(5).equals(new C(5))); //true
System.out.println(new C(5).equals(new C(4))); //false
但是,如果您使用'[this]'修饰符,则下面的代码将无法编译
class C(private[this] val x: Int) {
override def equals(obj: Any) = obj match {
case other: C => this.x == other.x //problem is here
case _ => false
}
}
这是因为在第一种情况下,“ x”在类级别可访问,而在第二种情况下,它是更严格的实例级别。这意味着只能从它所属的实例中访问“ x”。因此,“ this.x”很好,但“ other.x”却不行。
您可以参考“在Scala中编程:全面的循序渐进指南”一书的13.5节,以获取有关访问修饰符的更多详细信息。