Код: Выделить всё
// Foo1.java
public interface Foo1 {
void scale(int x, int y, int z);
}
// Foo2.java
public interface Foo2 {
void translate(int x, int y, int z);
}
Код: Выделить всё
// Foo1Extensions.kt
fun Foo1.scale(x: Int, y: Int, z: Int) = scale(x, y, z)
// Foo2Extensions.kt
fun Foo2.translate(x: Int = 0, y: Int = 0, z: Int = 0) = translate(x, y, z)
Kotlin 1.9.25:
Я получаю следующие предупреждения:
Расширение затеняется членом: public Abstract fun Scale(x: Int, y: Int, z: Int): Unit
Расширение затенено членом: public Abstract fun Translate(x: Int, y: Int, z: Int): Unit
Kotlin 2.1.0:
Я получаю аналогичные предупреждения:
Это расширение затенено членом: 'fun Scale(x: Int, y: Int, z: Int): Unit", определенный в '/Foo1'.
Это расширение затенено членом: 'fun Translate(x: Int, y: Int, z: Int): Unit', определенным в '/Foo2'.
Kotlin 2.0.0 и 2.2.0:
Никаких предупреждений не генерируется.
Я исследовал это вопрос и сформировал гипотезу. Я хотел бы знать, правильно ли я понимаю.
1. Что касается Kotlin 2.0.0
Похоже, что отсутствие предупреждения в 2.0.0, вероятно, было связано с отсутствующей функцией или пробелом в реализации в первоначальной
версии компилятора K2.
2. Что касается Kotlin 2.2.0
В версии 2.2.0, похоже, подавление предупреждения является намеренным. Кажется, это отражает проектное решение, согласно которому, даже если
сигнатура функции расширения соответствует члену Java, расширение все равно остается отличным и функционально полезным из-за
функций Kotlin, таких как именованные аргументы и параметры по умолчанию.
Например:
Код: Выделить всё
// This calls the Java member method
foo2.translate(1, 1, 1)
// These call the Kotlin extension function
foo2.translate(1)
foo2.translate(y = 1)
foo2.translate(x = 1, y = 1, z = 1)
Подробнее здесь: https://stackoverflow.com/questions/798 ... n-versions
Мобильная версия