有人可以帮助我理解以下两个声明吗?
class Person1(name: String, id: Int) { }
class Person2(val name: String, val id: Int) { }
val p1 = new Person1("personOne", 1)
val p2 = new Person2("personTwo", 2)
println(p1.name) // ERROR
println(p2.name) // OK!!
我知道默认情况下参数是val
。为什么第一个p1
能够返回数据p2
却不能做同样的事情
从Scala规范正式开始:
形式值参数的范围包括所有后续参数部分和模板t。但是,形式值参数可能不构成任何父类或类模板t成员的类型的一部分。定义两个具有相同名称的形式值参数是非法的。
参数部分和模板t
基本上描述了整个类范围。
在Scala的JVM实现上,当您在Scala中创建一个类并且不指定val
关键字时,编译器会将字段范围设置为,private[this]
并且不会为外部可见性创建匹配方法。含义(感谢@Duelist的用语),这些值仅在封闭类的范围内(这包括类方法和任何惰性字段),仅此而已:
class Person1 extends scala.AnyRef {
<paramaccessor> private[this] val name: String = _;
<paramaccessor> private[this] val id: Int = _;
def <init>(name: String, id: Int): yuval.tests.Person1 = {
Person1.super.<init>();
()
};
<empty>
};
当您添加val
关键字时:
class Person1 extends scala.AnyRef {
<paramaccessor> private[this] val name: String = _;
<stable> <accessor> <paramaccessor> def name: String = Person1.this.name;
<paramaccessor> private[this] val id: Int = _;
<stable> <accessor> <paramaccessor> def id: Int = Person1.this.id;
def <init>(name: String, id: Int): yuval.tests.Person1 = {
Person1.super.<init>();
()
};
<empty>
};
将Adef
添加到字段中,使它们在封闭类的外部可见,因此可以在使用现场看到。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句