Class 正在初始化具有特征的匿名类
有人能帮我理解以下行为吗 简单地说:以下两种情况的区别是什么 我定义了一个简单的类Class 正在初始化具有特征的匿名类,class,scala,inheritance,initialization,traits,Class,Scala,Inheritance,Initialization,Traits,有人能帮我理解以下行为吗 简单地说:以下两种情况的区别是什么 我定义了一个简单的类c+traitt 我可以实例化一个新的“c和t” 但是我不能用t实例化一个新的“[匿名类,就像c]一样” scala>new{val x=true;val y=this.x}和t :9:错误:类型不匹配; 发现:类型 必需:?{def x:?} :9:错误:值x不是对象$iw的成员 带t的新{val x=true;val y=this.x} 这两种情况有什么区别 谢谢 这就是你想要的: new t {val x=
c
+traitt
我可以实例化一个新的“c和t”
但是我不能用t实例化一个新的“[匿名类,就像c]一样”
scala>new{val x=true;val y=this.x}和t
:9:错误:类型不匹配;
发现:类型
必需:?{def x:?}
:9:错误:值x不是对象$iw的成员
带t的新{val x=true;val y=this.x}
这两种情况有什么区别
谢谢 这就是你想要的:
new t {val x=true; val y=this.x}
如果你有另一个特点,u{}
,你可以用u{val x=true;val y=this.x}写新的t,你已经偶然发现了“早期定义”语法()
查看语言规范第5.1.6节:
早期定义在以下范围内进行类型检查和评估:
在定义模板之前生效,由任何
封闭类和任何早期定义的类型参数
在被定义的一个之前。特别是,任何对本
在右手边的一个早期定义是指身份
这个
就在模板之外<因此,不可能
早期的定义是指由
模板,或引用其字段和方法之一,但任何
同一节中前面的其他早期定义。
在您的情况下,问题在于this.x
。如果您将其替换为x
,那么您指的是上面最后一句中提到的“前面的早期定义”(谢谢,@som snytt!),它将编译
当然,你们可能并没有打算写一个早期的初始值设定项,所以就按照克里斯蒂安·多马加拉的答案写吧。你们只需要去掉这个,就像黑体字所说的那个样<代码>带t的新{val x=true;val y=x}
scala> new c with t
res32: c with t = $anon$1@604f1a67
scala> new {val x=true; val y=this.x} with t
<console>:9: error: type mismatch;
found : type
required: ?{def x: ?}
<console>:9: error: value x is not a member of object $iw
new {val x=true; val y=this.x} with t
new t {val x=true; val y=this.x}