加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

理解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].同样在第二种情况下.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读