理解Scala中的“类型参数不符合类型参数边界”错误
发布时间:2020-12-16 18:48:05 所属栏目:安全 来源:网络整理
导读:以下为什么不工作? scala abstract class Foo[B:Foo[B]]defined class Fooscala class Goo[B:Foo[B]](x: B)defined class Gooscala trait Hoo[B:Foo[B]] { self: B = new Goo(self) }console:9: error: inferred type arguments [Hoo[B] with B] do not con
以下为什么不工作?
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].同样在第二种情况下.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |