【发布时间】:2014-10-25 08:24:40
【问题描述】:
我需要一个异构、类型安全的容器来存储不相关的类型 A、B、C。
这是一种类型级别的规范:
trait Container {
putA(a: A)
putB(b: B)
putC(c: C)
put(o: Any) = { o match {
case a: A => putA(a)
case b: B => putB(b)
case c: C => putC(c)
}
getAllAs : Seq[A]
getAllBs : Seq[B]
getAllCs : Seq[C]
}
哪种类型最适合支持此容器?
是否值得为 A、B、C 类型创建一个 Containerable[T] 类型类?
谢谢。
【问题讨论】:
-
如果
A和B中的任何一个碰巧相同,put(o: Any)不是安全操作。 -
我假设
A、B和C不是泛型类型,因为那样的话,在运行时,它们将被擦除到它们的上限,从而使您的match语句仅在最一般的情况下与Any匹配,即,所有内容都将使用putA调用。如果它们不是通用的并且不是彼此的子类型,那么put(o: Any)仍然不是类型安全的,因为您可以放置D,这将导致匹配错误。 - 关于你的问题:你可以用一个简单的元组来支持它。由于它将被接口抽象出来,因此您应该能够随时更换实现。 -
@KuluLimpa - 你可以通过
ClassTagging 来做通用版本,然后使用isAssignableFrom。但是,如果类相同,这并不能阻止所有 B 进入 A 的插槽。 -
@RexKerr 谢谢你分享这个。我不知道
ClassTag反射功能。
标签: scala collections shapeless heterogeneous