scala嵌套自类型

scala嵌套自类型,scala,self-type,Scala,Self Type,为什么这不起作用: scala> trait A defined trait A scala> class Z { | this: A => | } defined class Z scala> class Y { | this: A => | val z = new Z() | } <console>:11: error: class Z cannot be instantiated because

为什么这不起作用:

scala> trait A
defined trait A

scala> class Z {
     | this: A =>
     | }
defined class Z

scala> class Y {
     | this: A =>
     | val z = new Z()
     | }
<console>:11: error: class Z cannot be instantiated because it does not conform to its self-type Z with A
       val z = new Z()
scala>trait A
定义特征A
scala>Z类{
|这个:A=>
| }
定义类Z
scala>Y类{
|这个:A=>
|val z=新的z()
| }
:11:错误:无法实例化类Z,因为它不符合具有
val z=新的z()
我希望被混合到Y中的A再次被混合到Y中Z的实例中。我怎么做呢

EDIT(在上面的示例中试图过于简短。这是我的实际问题):

scala>导入scala.slick.driver.ExtendedProfile
导入scala.slick.driver.ExtendedProfile
scala>Z类{
|此:ExtendedProfile=>
| }
定义类Z
scala>Y类{
|此:ExtendedProfile=>
|val z=带有ExtendedProfile的新z()
| }
:21:错误:非法继承;
带有scala.slick.driver.ExtendedProfile的自类型Z与scala.slick.driver.ExtendedProfile的自类型scala.slick.driver.ExtendedDriver不一致
val z=带有ExtendedProfile的新z()
^
我想我理解为什么不能编译,但这不应该是隐式的(不是实际的scala关键字“implicit”,只是通常是隐式的;)?如果ExtendedProfile总是必须有一个ExtendedDriver,为什么new Z()抱怨它需要一个ExtendedDriver


仅供参考:

编译错误表示需要提供一个
A
混合来实例化
Z
对象。正如om non nom所建议的,您的代码只需稍加修改即可编译

trait A

class Z { this: A =>
}

class Y { this: A =>
  val z = new Z with A
}
这里有一个使用继承而不是自我类型的替代方案,可能更接近您的意图:

trait Y extends A {
  val z = new Z with Y
}
编辑

为了回答您更新的问题,self类型是类型构造的一个约束。自类型不同于继承,因为它们不扩展类型的外部接口

从您链接的Scaladoc来看,情况如下:

trait ExtendedDriver extends ExtendedProfile
trait ExtendedProfile { self: ExtendedDriver => }

class Z { this: ExtendedProfile => }

class Y {
  this: ExtendedProfile =>
  val z = new Z() with ExtendedProfile
}
问题是
ExtendedProfile
没有继承自
ExtendedDriver
,因此它不能独立存在;它需要提供一个显式的
扩展驱动程序
。你可以用它来做

new Z() with ExtendedProfile with ExtendedDriver
这实际上是多余的,因为
ExtendedProfile
已经混合在一起了。你只需要

new Z() with ExtendedDriver

带有也许?@om-nom-nom建议的新Z()肯定会编译。但我不确定这是否是雷斯特的意图,因为Y是一个扩展概要文件的事实并不意味着它的成员也是一个扩展概要文件。在你的示例中,A也是如此。谢谢。我用实际发生的事情更新了我的问题。
new Z() with ExtendedDriver