Действительно, для того, чтобы подставить в уравнение точку R, нам сначала необходимо найти эту самую точку R, которую, в свою очередь, необходимо будет вычислить с помощью кубического уравнения. Автор же приводит более изящный метод проверки результата.
В конкретном случае сложение определяется, как ассоциативная бинарная операция, которая берет какие-либо две точки и выдает третью на их основе. Поправьте меня, если я не прав.
В первом случае все нормально, а во втором получается compilation error. И проблема в дизайне языка.
interface Foo<T> {
fun bar(vararg a: T)
}
class NormalDouble: Foo<java.lang.Double> {
override fun bar(vararg a: java.lang.Double) {
throw UnsupportedOperationException()
}
}
class BadDouble: Foo<kotlin.Double> {
override fun bar(vararg a: kotlin.Double) {
throw UnsupportedOperationException()
}
}
Для vararg a: T генерируется Object[] a, и для vararg a: Intэто int[] a , что не является переопределением.
Есть один вариант пофиксить это: для bar компилятор будет генерировать Integer[], вместо int[].
Но другая проблема возникает здесь:
val bi = BadInt()
val arr = intArrayOf(1, 2)
bi.bar(*arr) // Здесь проблема
Вообще можно сделать отдельный оператор, который будет боксить каждый элемент массива, но это будет очень медленно. Единственный вариант для решения этой проблемы без изменения дизайна языка — ждать релиза проекта Valhalla.
И не только в JS.
Но идея выкинуть дженерики из языка хорошая, мне нравится.
А вообще таск открыт.
Для vararg a: T генерируется Object[] a, и для vararg a: Int это int[] a , что не является переопределением.
Есть один вариант пофиксить это: для bar компилятор будет генерировать Integer[], вместо int[].
Но другая проблема возникает здесь:
Вообще можно сделать отдельный оператор, который будет боксить каждый элемент массива, но это будет очень медленно. Единственный вариант для решения этой проблемы без изменения дизайна языка — ждать релиза проекта Valhalla.