我試圖找出如何調用構造函數Scala的抽象類型:如何調用Scala抽象類型的構造函數?
class Journey(val length: Int)
class PlaneJourney(length: Int) extends Journey(length)
class BoatJourney(length: Int) extends Journey(length)
class Port[J <: Journey] {
def startJourney: J = {
new J(23) // error: class type required but J found
}
}
這甚至是可行的?我熟悉Scala manifests,但我不清楚他們在這裏可以如何幫助。同樣我無法弄清楚如何做同樣的同伴對象的適用()構造函數:
object Journey { def apply() = new Journey(0) }
object PlaneJourney { def apply() = new PlaneJourney(0) }
object BoatJourney { def apply() = new BoatJourney(0) }
class Port[J <: Journey] {
def startJourney: J = {
J() // error: not found: value J
}
}
任何想法感激地接受!
謝謝莫里茨 - 但是將代碼粘貼到REPL中會引發一些錯誤?另外如何將參數添加到默認的「構造函數」? –
您必須爲此代碼輸入粘貼模式才能在REPL中工作(只需在粘貼前鍵入':paste')即可。 Philippe修復的代碼也存在錯誤。 – Moritz
如果你想添加參數,你可以簡單地在'Default'特性中添加一個新的方法。 '默認[J]]'會給你一個帶有提供的類型參數的特性實例,你可以調用你喜歡的任何方法,例如, '隱式[默認[J]]。創建(23)'。請參閱示例[此問題](http://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits)以瞭解有關隱含工作的詳細信息。 – Moritz