如何解决以一种类型安全的方式合并相关的ADT
我正在设计一种可以与“类型”一起使用的类型安全api-我正在处理的应用程序中的抽象。这是它的样子:
sealed trait EnumType
case object A extends EnumType
case object B extends EnumType
case object C extends EnumType
sealed abstract class TypeInfo[T <: EnumType](val enumType: T)
case class Ainfo() extends TypeInfo(A)
case class Binfo() extends TypeInfo(B)
case class Cinfo() extends TypeInfo(C)
sealed trait TypeMeta[T <: EnumType]
case class AMeta() extends TypeMeta[A.type]
case class BMeta() extends TypeMeta[B.type]
case class CMeta() extends TypeMeta[C.type]
case class TypeDescription[T <: EnumType](info: TypeInfo[T],Meta: TypeMeta[T])
对于定义一个接受List
中的TypeInfo
并返回TypeDescription
的函数,我感到困惑。我目前将其实现如下:
//Type parameter with omitted bound? Is that type safe?
def toDescription(lst: List[TypeInfo[_]]): List[TypeDescription[_]] = {
lst map {
case a: Ainfo => TypeDescription(a,AMeta())
case b: Binfo => TypeDescription(b,BMeta())
case c: Cinfo => TypeDescription(c,CMeta())
}
}
要解决此问题,我使用了[_]
模式,该模式看起来不太安全。有没有办法重新声明该功能?
解决方法
其类型为safe,但是2个类型参数分别绑定到它们自己的约束,而不是彼此绑定。 如果您打算这样做,我认为您需要像这样定义一个方法类型参数
//Type parameter with omitted bound? Is that type safe?
def toDescription[T<:EnumType](lst: List[TypeInfo[T]]): List[TypeDescription[T]] = {
lst map {
case a: Ainfo => TypeDescription(a,Ameta())
case b: Binfo => TypeDescription(b,Bmeta())
case c: Cinfo => TypeDescription(c,Cmeta())
}
}
现在,如果您想写
case a: Ainfo => TypeDescription(a,Bmeta())
您会收到编译错误
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。