0

なぜこれが機能しないのですか?

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()

Yに混合されたAをYのZのインスタンスに再び混合したいのですが、どうすればよいですか?

編集(上記の例では簡潔になりすぎていました。これが私の実際の問題です):

scala> import scala.slick.driver.ExtendedProfile
import scala.slick.driver.ExtendedProfile

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

scala> class Y {
     | this: ExtendedProfile =>
     | val z = new Z() with ExtendedProfile
     | }
<console>:21: error: illegal inheritance;
 self-type Z with scala.slick.driver.ExtendedProfile does not conform to scala.slick.driver.ExtendedProfile's selftype scala.slick.driver.ExtendedDriver
       val z = new Z() with ExtendedProfile
                        ^

なぜそれがコンパイルされないのか理解していると思いますが、これは暗黙的であるべきではありません(実際のscalaキーワード'implicit'ではなく、一般的に暗黙的です;))?ExtendedProfileに常にExtendedDriverが必要な場合、なぜnew Z()がExtendedDriverが必要であると文句を言うのですか?

参考:http ://slick.typesafe.com/doc/1.0.0-RC1/api/#scala.slick.driver.ExtendedProfile

4

1 に答える 1

1

Aコンパイル エラーは、オブジェクトをインスタンス化するために mix-in を提供する必要があることを示してい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
}

編集

更新された質問に答えるために、自己型は型構築の制約です。自己型は、型の外部インターフェイスを拡張しないという点で継承とは異なります。

リンクした 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ため、単独で使用できないことです。明示的に提供する必要がありますExtendedDriver。あなたはそれを行うことができます

new Z() with ExtendedProfile with ExtendedDriver

すでに混在しているため、実際には冗長ExtendedProfileです。必要なのは、

new Z() with ExtendedDriver
于 2013-01-11T17:20:03.890 に答える