私は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
}
}
ありがたく受け取った任意の考え:同様に私が)のは、(適用オブジェクトコンパニオンと同じことを行う方法を、コンストラクタを把握することはできません!
Moritzさんに感謝します - しかし、REPLにコードを貼り付けるといくつかのエラーが発生しますか?また、デフォルトの「コンストラクタ」にパラメータを追加するにはどうすればよいですか? –
このコードがREPLで機能するには、貼り付けモードを入力する必要があります(貼り付ける前に ':paste'と入力するだけです)。 Philippeによって修正されたコードにもエラーがありました。 – Moritz
パラメータを追加したい場合は、 'Default'特性に新しいメソッドを追加するだけです。 '暗黙的に[Default [J]]'は、指定された型パラメータを持つ型のインスタンスを与え、あなたが好きなメソッドを呼び出すことができます。 '暗黙的に[デフォルト[J]]。create(23)'。 implicitsの仕組みの詳細については、[この質問](http://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits)を参照してください。 – Moritz