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

scala – Trait不符合类型参数边界

发布时间:2020-12-16 18:14:21 所属栏目:安全 来源:网络整理
导读:我有类型的问题. 在这种情况下,我有两个基本方法的特征,其中一个取决于另一个. 之后,我有两个实现. 你知道这里有什么问题吗? 编译器说: type arguments [ImplDefinition,ImplDto,ImplDtoIdentifier] do not conform to trait ChildOperations's type param
我有类型的问题.
在这种情况下,我有两个基本方法的特征,其中一个取决于另一个.
之后,我有两个实现.
你知道这里有什么问题吗?

编译器说:

type arguments [ImplDefinition,ImplDto,ImplDtoIdentifier] do not conform to trait ChildOperations's type parameter bounds [C <: Types.BaseT[A,I],A <: Types.IDObj[I],I <: IIdentifier]
[error] class ImplOperations extends Parent2(new ImplDefinition) with ChildOperations[ImplDefinition,ImplDtoIdentifier] {

代码:

/*
 * Generic Implementation
 */

object Types {

  type IDObj[I <: IIdentifier] = AnyRef {def id: I}

  type BaseT[A,I <: IIdentifier] = Parent1[A] {
    def id: Foo[I]
  }

}

trait IIdentifier extends Any {
  def id: Long

  override def toString = id.toString
}

class Parent1[A](a: String)

class Foo[A](a: String)

trait ChildDefinition[A <: Types.IDObj[I],I <: IIdentifier] {
  self: Parent1[A] =>

  def id(a: A): Foo[I]

}

class Parent2[A](a: A)

trait ChildOperations[C <: Types.BaseT[A,I <: IIdentifier] {
  self: Parent2[C] =>

  def get(identifier: I): Option[A]
}

/*
 * Concrete Implementation
 */

case class ImplDtoIdentifier(id: Long) extends IIdentifier

case class ImplDto(id: ImplDtoIdentifier,name: String)

class ImplDefinition extends Parent1[ImplDto]("Value") with ChildDefinition[ImplDto,ImplDtoIdentifier] {
  override def id(a: ImplDto): Foo[ImplDtoIdentifier] = ???
}

class ImplOperations extends Parent2(new ImplDefinition) with ChildOperations[ImplDefinition,ImplDtoIdentifier] {
  self =>
  override def get(identifier: ImplDtoIdentifier): Option[ImplDto] = ??? // here I will use the id method from ImplDefinition
}

解决方法

问题似乎是ImplDefinition中id def的签名.
Types.BaseT要求一个def id:Foo [I]但是ImplDefinition只提供一个def id(a:ImplDto):Foo [ImplDtoIdentifier]
如果你添加一个def id:Foo [ImplDtoIdentifier] = ???到ImplDefinition类的东西会编译:

class ImplDefinition extends Parent1[ImplDto]("Value") with ChildDefinition[ImplDto,ImplDtoIdentifier] {
  def id:Foo[ImplDtoIdentifier] = ???
  override def id(a: ImplDto): Foo[ImplDtoIdentifier] = ???
}

(编辑:李大同)

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

    推荐文章
      热点阅读