Я нашел ошибку в моем скала-коде, которая меня озадачивает. Ниже приведен упрощенный вариант проблемы.
В конструкторе абстрактного класса я хочу проверить несколько утверждений об абстрактных методах.
Таким образом, когда создается объект подкласса, эти утверждения проверяются, чтобы убедиться, что все реализовано так, как должно.
Плохо, когда подкласс реализует абстрактный метод, используя «val», однако:
Scala код:
abstract class A {
def aval : String
assert(aval != null, "aval == null")
assert(aval == "B", "aval: "+aval)
}
class B extends A {
def aval = "B"
}
class C extends A {
val aval = "B"
}
object VariousScalaTests {
def main(args : Array[String]) : Unit = {
val b = new B
val c = new C
}
}
Ошибка Scala:
Exception in thread "main" java.lang.AssertionError: assertion failed: aval == null
at scala.Predef$.assert(Predef.scala:92)
at A.<init>(VariousScalaTests.scala:4)
at C.<init>(VariousScalaTests.scala:12)
at VariousScalaTests$.main(VariousScalaTests.scala:19)
at VariousScalaTests.main(VariousScalaTests.scala)
Таким образом, происходит сбой в последней строке кода: «val c = new C».
Класс B работает отлично, а класс C - нет! Единственное отличие состоит в том, что C реализует aval, используя «val», а B - «def».
Так что мой вопрос, больше всего, почему эта разница? Я не понимаю, что происходит.
И есть ли способ заставить его работать так, как я хочу, в обоих случаях в scala? Или мне просто не хватает более элегантного способа отстаивать то, что я хочу в scala?