Aval
は計算されてフィールドに格納されるため、引数を取りません。しかし、私が過去2日間にメーリングリストで行った広範な投稿を参照するだけかもしれません。
または、むしろ、Javaの観点から考えてみましょう。ScalaはjvmレベルでJavaと互換性があり、jvmのルールに必ず従う必要があるためです。最初のクラスから始めましょう:
abstract class X {
def expensiveOperation(p: Int => Boolean) : List[Int]
}
それでは、拡張してみましょう。
abstract class Y extends X {
override val expensiveOperation: ((Int) => Boolean) => List[Int]
}
したがって、Javaから、クラスには、を受け取って返すX
メソッドがあることがわかります。expensiveOperation
Function1[Int, Boolean]
List[Int]
次に、クラスに移動しY
ます。当然、同じメソッドを定義する必要がありますが、expensiveOperation
引数を受け取らずにを返すgetterも定義する必要がありますFunction1[Function1[Int, Boolean],List[Int]]
。
この追加のメソッドが存在しない限り、それは実行可能かもしれませX
ん。それでは、それを定義しましょう:
class Z extends Y {
override val extensiveOperation = new Function1[Function1[Int, Boolean], List[Int]] {
def apply(p: Int => Boolean) = List range (1, 10) filter p
}
}
それはどのように定義されますか?Scalaはの本体を(ゲッターではなくパラメーターを受け取るもの)apply
の本体としてコピーしますか?expensiveOperation
それはまだ実行可能かもしれません。ただし、別のことを試してみましょう。
class W(f: ((Int) => Boolean) => List[Int]) extends Y {
override val extensiveOperation = f
}
では、パラメータの受信をどのようにオーバーライドしますextensiveOperation
か?私たちはそれを次のように書くことができると思います:
override def extensiveOperation(p: Int => Boolean) = extensiveOperation.apply(p)
それは実行可能です。しかし、私は個人的に、それは少し複雑だと思います。私の提案:短いSIDを書いて、Scalaメーリングリストで合意を得てください。ただし、それを実装するコードがなければ、採用される可能性はあまりないと思いval
ます。Scalaは、オーバーライドされているかどうかを判断するために、すべての関数型を追跡する必要がありますdef
。