我有以下問題。我們的項目有很多代碼,它們在Scala中運行測試。而且有大量的代碼,填充這樣的字段:Scala可以從調用者實際預期的返回類型推斷出實際類型嗎?
production.setProduct(new Product)
production.getProduct.setUuid("b1253a77-0585-291f-57a4-53319e897866")
production.setSubProduct(new SubProduct)
production.getSubProduct.setUuid("89a877fa-ddb3-3009-bb24-735ba9f7281c")
最後,我厭倦了這個代碼,因爲所有這些領域實際上是有UUID領域的基本類的子類,所以,想了一會兒後,我寫了這樣的輔助功能:
def createUuid[T <: GenericEntity](uuid: String)(implicit m : Manifest[T]) : T = {
val constructor = m.runtimeClass.getConstructors()(0)
val instance = constructor.newInstance().asInstanceOf[T]
instance.setUuid(uuid)
instance
}
現在,我的代碼更短了兩次,因爲現在我可以寫這樣的事:
production.setProduct(createUuid[Product]("b1253a77-0585-291f-57a4-53319e897866"))
production.setSubProduct(createUuid[SubProduct]("89a877fa-ddb3-3009-bb24-735ba9f7281c"))
這是很好的,但我想知道,如果我能以某種方式實現功能createUuid所以最後一點想這樣:
// Is that really possible?
production.setProduct(createUuid("b1253a77-0585-291f-57a4-53319e897866"))
production.setSubProduct(createUuid("89a877fa-ddb3-3009-bb24-735ba9f7281c"))
燦Scala編譯器的猜測,即setProduct希望不只是一個普通的實體,但實際上類似產品(或它的子類)?或者Scala沒有辦法實現這個更短的?
我有大約30種類型,這是GenericEntity的子類,我必須爲它們所有人寫這樣的隱式def嗎?或者我可以只做一次? –