我有一些類型的集合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