以下为什么不工作?
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]与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 }
我正在尝试在TEXT旁边引入一个名为BYTEA的新扩展方法,以便可以编写:
class MyRecord extends XRecord[Int,MyRecord] { val myfield = "myfield".BYTEA // implicit active only inside this scope }
我的尝试:
class XDefinitionHelper[R <: Record[_,record: R) { def BYTEA = ... } trait XRecord[PK,R]] { self: R => implicit def newView(x: String) = new XDefinitionHelper(x,self) }
但是这与我上面的小测试案例遇到的问题相同.
解决方法
在第一次尝试中,你确实有H [B]与B<:Foo [B].但是对于Goo [Hoo [B] with B]存在,你需要Hoo [B]与B<:Foo [Hoo [B] with B].同样在第二种情况下.