Почему можно опустить значения по умолчанию в переопределенных функциях-членах подтипов?

Как указано в заголовке: Почему возможно игнорировать значения по умолчанию в переопределенных функциях-членах подтипов?

Является ли это нормальным или ожидаемым?

interface Foo {
  fun bar(parameter: Int = 1)
}

class Baz : Foo {
  override fun bar(parameter: Int) { // OK
    println(parameter)
  }
}

val baz = Baz()

baz.bar() // OK
baz.bar(2) // OK

Такое поведение в случае, когда Foo является классом.

Ответ 1

Является ли это нормальным или ожидаемым?

Да.

Я подозреваю, что это было прежде всего решение языка/юзабилити. С этой точки зрения было доступно четыре варианта:

  • Объявлять только в супертипе.
  • Объявлять только подтип.
  • Объявить в обоих, но не разрешать подтип изменять значение по умолчанию.
  • Объявить в обоих, разрешить подтип переопределять значение по умолчанию в супертипе.

Дизайнеры Kotlin выбрали вариант №1. Это имеет смысл, потому что:

Вариант № 2 и № 4 подразумевают, что вызывающие абоненты не будут знать, что такое значение по умолчанию, если только они не знают, какую реализацию они используют, что, конечно, крайне нежелательно. Абоненту потребуется дополнительная логика, чтобы определить, требуется ли значение для переопределения значения по умолчанию, что означает, что значение по умолчанию было бы бесполезным.

Вариант № 3 нарушает принцип DRY. Зачем объявлять объявление в двух местах?

Это оставляет опцию № 1 как единственный разумный выбор.

Ответ 2

Да, это нормально и можно ожидать.

Более того, не разрешено переопределять значения по умолчанию. Это не компилируется:

interface Foo {
    fun bar(parameter: Int = 1)
}

class Baz : Foo {
    override fun bar(parameter: Int = 1) { // ERROR: An overriding function is not allowed to specify default values for its parameters
    }
}

Технически реализация с фиксированными значениями по умолчанию намного проще, чем любая другая реализация. Например, Scala значительно расширяет возможности этой возможности, но сгенерированный байт-код не является простым.