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

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

Этонормальный или следовало ожидать?

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 это класс.

Ответы на вопрос(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 делает все возможное, чтобы обеспечить эту возможность, но сгенерированный байт-код не является простым.

 EPadronU08 июн. 2016 г., 13:28
Подскажите, пожалуйста, где в документах я могу найти соответствующую информацию?
 marstran08 июн. 2016 г., 14:52
Это, вероятно, наивно, но разве невозможно скомпилировать переопределенный параметр по умолчанию в переопределенный метод без параметров, вызывающих другой метод с новым параметром по умолчанию?
 EPadronU08 июн. 2016 г., 13:34
Не беспокойся об этом. Это объясняет, почему я не смог его найти, хотя :)
 voddan08 июн. 2016 г., 13:33
Извините, не могу найти это сам. Это ошибка в документации
Решение Вопроса

Это нормально или следовало ожидать?

Да.

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

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

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

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

Вариант № 3 нарушает принцип СУХОГО. Зачем заставлять декларацию находиться в двух местах?

Это оставляет Вариант № 1 как единственный вменяемый выбор.

Ваш ответ на вопрос