Ошибка, которую вы получаете, не имеет ничего общего с набором или динамическим c полиморфизмом:
var animal : Animal = _
^
On line 19: error: local variables must be initialized
Как вы видите, в типах в вашей программе нет ничего плохого, вам просто нужно правильно инициализируйте вашу переменную:
def main() : Unit = {
var animal = if(config.getString("ANIMAL_TYPE").equals("Dog")) {
Dog
} else {
Cat
}
// this should print either bark or meow
animal.sound
}
Обратите внимание, что в вашем коде есть пара не-идиоматических вещей c. Более идиоматическая версия c будет выглядеть примерно так:
trait Animal {
val sound: String
}
object Cat extends Animal {
override val sound = "meow"
}
object Dog extends Animal {
override val sound = "bark"
}
def main(): Unit = {
val animal = if (config.getString("ANIMAL_TYPE").equals("Dog")) Dog else Cat
// this should print either bark or meow
print(animal.sound)
}
- Используйте
trait
вместо abstract class
. - Не используйте пустой конструктор / initializer, просто не используйте конструктор / инициализатор.
- Отдельный ввод / вывод от вычислений: печать должна выполняться методом
main
, а не Animal
. - . явный модификатор
override
. - Не используйте аннотации типов, если тип очевиден.
- Не используйте фигурные скобки вокруг одиночных выражений.
- Не используйте
var
, всегда используйте val
. if
- это выражение, не игнорируйте его возвращаемое значение.