Yan*_*ang 6 scala bounded-quantification
以下为什么不工作?
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) }
^
Run Code Online (Sandbox Code Playgroud)
在第一次尝试中,不是Hoo[B] with B <: Foo[B]吗?
在第二次尝试中,不是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
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试在TEXT旁边引入一个名为BYTEA的新扩展方法,以便可以编写:
class MyRecord extends XRecord[Int, MyRecord] {
val myfield = "myfield".BYTEA // implicit active only inside this scope
}
Run Code Online (Sandbox Code Playgroud)
我的尝试:
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)
}
Run Code Online (Sandbox Code Playgroud)
但是这与我上面的小测试案例遇到的问题相同.
在第一次尝试中,您确实拥有Hoo[B] with B <: Foo[B]. 但为了Goo[Hoo[B] with B]存在,你需要Hoo[B] with B <: Foo[Hoo[B] with B]。第二种情况也是如此。
| 归档时间: |
|
| 查看次数: |
2669 次 |
| 最近记录: |