Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 正在初始化具有特征的匿名类_Class_Scala_Inheritance_Initialization_Traits - Fatal编程技术网

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
+trait
t
我可以实例化一个新的“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}