繁体   English   中英

如何从 Scala 中的特征访问类型成员

[英]How can I access type members from a trait in Scala

我正在尝试创建一个类型来捕捉一对相关类型的想法。

然后我想编写对捕获的类型进行参数化的函数。 不幸的是,我无法正确表达类型并最终导致类型不匹配。

我非常喜欢使用类型参数和摆脱类型成员,但我不确定如何引用类型参数。

这是我的测试代码

class Types {

  trait TypePair[A, B] {
    type FROM = A
    type TO   = B
  }

  class Execute[TP <: TypePair[_, _]](func: TP#FROM => TP#TO) {

    def execute(in: TP#FROM): TP#TO = func(in)

  }

}

这是错误信息

Error:(12, 44) type mismatch;
 found   : in.type (with underlying type _$1)
 required: _$1
    def execute(in: TP#FROM): TP#TO = func(in)`

这应该足以满足您的第一个要求。

object Types {
  sealed trait Request

  object Request {
    final case object ARequest extends Request
    final case object BRequest extends Request
  }

  sealed trait Response

  object Response {
    final case object AResponse extends Response
    final case object BResponse extends Response
  }

  trait TypePair[I <: Request, O <: Response]

  object TypePair {
    implicit final val ARequestAResponse: TypePair[Request.ARequest, Response.AResponse] =
      new TypePair[Request.ARequest, Response.AResponse]

    implicit final val BRequestAResponse: TypePair[Request.BRequest, Response.AResponse] =
      new TypePair[Request.BRequest, Response.AResponse]

    implicit final val BRequestBResponse: TypePair[Request.BRequest, Response.BResponse] =
      new TypePair[Request.BRequest, Response.BResponse]
  }

  final class Execute[-I, +O](func: I => O)(implicit ev: TypePair[I, O])  {
    def execute(in: I): O = func(in)
  }
}

我不太明白你的第二个要求,所以我不确定这是否足以满足你的需要。 如果没有,请随时留下您的反馈并使用更多信息编辑您的问题。 或者如果您觉得问题非常不同,则打开一个新的。

我认为如果您摆脱类型通配符,您可以解决这个问题,例如:

class Types {

  trait TypePair[A, B] {
    type FROM = A
    type TO = B
  }

  sealed trait ABType
  case class ABTypeInt() extends ABType
  case class ABTypeString() extends ABType

  class Execute[TP <: TypePair[ABType, ABType]](func: TP#FROM => TP#TO) {

    def execute(in: TP#FROM): TP#TO = func(in)
  }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM