Управление именем JVM переопределенного свойства в классе KotlinJAVA

Программисты JAVA общаются здесь
Anonymous
 Управление именем JVM переопределенного свойства в классе Kotlin

Сообщение Anonymous »

Я создал класс Kotlin, чтобы скрыть какую -то уродливую бизнес -логику. Класс используется как потребителями Kotlin, так и Java. Он функционирует как набор строк и строит из этого минимального примера < /p>

Код: Выделить всё

class FooCollection(val items: Array) : Collection
{
override fun iterator(): Iterator = items.iterator()
override fun contains(item: String): Boolean = items.contains(item)
override fun containsAll(elements: Collection): Boolean = elements.all {contains(it)}
override fun isEmpty():Boolean =  items.isEmpty()
override val size: Int get() = items.size
}
Он работает нормально, но потребители Java должны получить доступ к свойству размер , вызывая getSize () , что выглядит неестественно по сравнению с ароматом Java Collection , который имеет size () метод.
Я хотел бы выявить size as size () в Java. Я пытался украсить с помощью @jvmname , но это не компилируется. Я думаю, что этот ответ дает представление о том, почему (не может смешать @jvmname с переопределениями).

Код: Выделить всё

// Compile error: '@JvmName' annotation is not applicable to this declaration
@get:JvmName
override val size: Int get() = items.size
Существует ли чистый способ раскрыть свойство как foocollection.size в kotlin, и foocollection.size () Явля ли Java? /p>
Лучшее, что я придумал, это < /p>

Код: Выделить всё

@get:JvmSynthetic // hide from java
override val size: Int get() = items.size

// Expose the size val as "size()" to java instead of "getSize()" to mimic java's Collection
@JvmName("size")
fun javaSize() = size
Единственным недостатком этого является то, что интерфейс Kotlin для класса теперь загрязнен функцией javasize . Есть ли способ сделать это скрытым?


Подробнее здесь: https://stackoverflow.com/questions/794 ... tlin-class

Вернуться в «JAVA»