【发布时间】:2020-09-09 21:21:49
【问题描述】:
我正在设计一个类型安全的 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])
我对定义一个接受TypeInfo 的List 并返回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())
}
}
为了解决这个问题,我使用了看起来不安全的[_] 模式。有没有办法重新声明函数?
【问题讨论】:
-
您可以使用 TypeMember 或干脆移除泛型类型。这取决于你想如何使用这些类,但如果你有一个不同类的列表,你似乎不需要泛型。
-
@LuisMiguelMejíaSuárez 引入泛型类型的主要目的是禁止
TypeDescription,例如Ainfo()和Cmeta()(没有泛型是完全可能的)。 -
对,没有类型元的类型信息有意义吗?没有类型信息的类型元有意义吗?这些广告还定义了哪些其他操作?
-
@LuisMiguelMejíaSuárez
TypeInfo和TypeMeta是两个独立的概念,具有独立的含义。他们的存在是完全明智的。List[TypeDescription[_]]旨在发送到前端。
标签: scala type-safety algebraic-data-types