6

以下が機能しないのはなぜですか?

scala> abstract class Foo[B<:Foo[B]]
defined class Foo

scala> class Goo[B<:Foo[B]](x: B)
defined class Goo

scala> trait Hoo[B<:Foo[B]] { self: B => new Goo(self) }
<console>:9: error: inferred type arguments [Hoo[B] with B] do not conform to class Goo's type parameter bounds [B <: Foo[B]]
       trait Hoo[B<:Foo[B]] { self: B => new Goo(self) }
                                         ^

scala> trait Hoo[B<:Foo[B]] extends Foo[B] { new Goo(this) }
<console>:9: error: inferred type arguments [Hoo[B]] do not conform to class Goo's type parameter bounds [B <: Foo[B]]
       trait Hoo[B<:Foo[B]] extends Foo[B] { new Goo(this) }
                                             ^

最初の試みではありませんHoo[B] with B <: Foo[B]か?

2回目の試みでは、そうではありませんHoo[B] <: Foo[B]か?

この問題を解決するために、次のようなライブラリがあります。

// "Foo"
abstract class Record[PK, R <: Record[PK, R]] extends Equals { this: R =>
  implicit def view(x: String) = new DefinitionHelper(x, this)
  ...
}
// "Hoo"
class DefinitionHelper[R <: Record[_, R]](name: String, record: R) {
  def TEXT = ...
  ...
}

// now you can write:
class MyRecord extends Record[Int, MyRecord] {
  val myfield = "myfield".TEXT
}

BYTEA と呼ばれる TEXT と一緒に新しい拡張メソッドを導入しようとしているので、次のように記述できます。

class MyRecord extends XRecord[Int, MyRecord] {
  val myfield = "myfield".BYTEA // implicit active only inside this scope
}

私の試み:

class XDefinitionHelper[R <: Record[_, R]](name: String, record: R) {
  def BYTEA = ...
}

trait XRecord[PK, R <: Record[PK, R]] { self: R =>
  implicit def newView(x: String) = new XDefinitionHelper(x, self)
}

しかし、これは上記の小さなテスト ケースと同じ問題に遭遇します。

4

2 に答える 2

2

最初の試行では、Hoo[B] with B <: Foo[B]. しかし、Goo[Hoo[B] with B]存在するためには、 が必要Hoo[B] with B <: Foo[Hoo[B] with B]です。2番目の場合も同様です。

于 2011-07-27T08:30:17.233 に答える
0

これは単純すぎるように思えますが(つまり、良い習慣であるとは言えません)、とにかくこれで私の日は救われました。

scala> trait MyTrait[T <: MyTrait[T]] { self: T => def hello = println("hello") }

scala> case class User(t: MyTrait[_])
<console>:8: error: type arguments [_$1] do not conform to trait MyTrait's type parameter bounds [T <: MyTrait[T]]
       case class User(t: MyTrait[_])

scala> case class User(t: () => MyTrait[_])
defined class User
于 2013-08-21T15:08:30.797 に答える