我有一些类型的集合Collection[SuperType]
。存储在这个集合中的几个值是子类型SuperType
,我希望集合只允许自己包含每个子类型的一个实例(有点像集合,但不是)。从参数到返回类型,在类型层次结构中的斯卡拉类型多态性
我试图写一个函数,鉴于上述亚型之一的同伴对象时,可以返回同伴对象所属的类的第一个实例。
最初我与集尝试作为如下所示,但T将从类型擦除遭受的,所以模式匹配将失败。然后我也意识到一个Set不适合这个任务,因为我只想要集合中每个子类型的一次出现。
def get[T <: SuperType](target: T): Option[SuperType] =
collection.collectFirst({
case target: T => target
})
我下了,目前的做法是使用地图,其中关键是同伴对象和值是同伴对象的类的实例。类型层次结构如下所示。
trait SuperType
trait SuperTypeValue
// Pretend this has some parameters
case class ExampleSubType extends SuperTypeValue
case object ExampleSubType extends SuperType {
// value for use in later example
val uniqueToObjectField: String = "hello"
}
val collection: Map[SuperType, SuperTypeValue] = // Some new map
def get(target: SuperType): Option[SuperTypeValue] =
collection.get(target)
以上工作效果不错。但是,我想保留用作参数的子类型的类型,并将其用作返回类型。我相信功能的签名看起来是这样的:
get[T <: SuperType](target: T): Option[T]
// So I could then do something like this
get(ExampleSubType) match {
case Some(exampleSubType) => exampleSubType.uniqueToObjectField
case _ => "nope"
}
这是可能的scala内吗?如果是这样,怎么样?如果不是,这是否存在于其他语言中,它叫什么?
希望有这个问题没有明显的问题,但它是凌晨2点,所以我要在早晨再次检查过的事情。
你能不能简单地重新定义equals方法返回如果两个实例都是相同的,则返回true,然后直接使用Set? –
好主意,应该有效。不知道我对劫持equals方法的感觉如何。 – Iain