Kotlin: несколько именованных сопутствующих объектов - PullRequest
2 голосов
/ 06 ноября 2019

Я уверен, что об этом спрашивали раньше, но я не могу найти ответ:

У меня есть класс, который подразумевает как java.io.Serializable, так и android.os.Parcelable. Для этих классов требуются сопутствующие объекты:

companion object CREATOR : Parcelable.Creator<MyClass> {
    override fun createFromParcel(parcel: Parcel): MyClass
    ...
}

и

companion object {
    private val serialVersionUid: Long = 123
}

Проблема в том, что у меня не может быть обоих этих сопутствующих объектов, потому что это вызывает исключение only one companion object per class.

Как я могу иметь два объекта-компаньона с разными именами в одном классе?

Ответы [ 2 ]

6 голосов
/ 06 ноября 2019

Может быть, вы неправильно поняли примеры Java.

public static Parcelable.Creator<SDFileDir> CREATOR = ...;
public static long serialVersionUid = 123;

В Java - да, это отдельный статический объект. Вы можете разместить любое количество статических полей в классе.

В Kotlin должен быть только один статический объект (здесь он называется Companion). Но это как еще один класс здесь. Поэтому все новые статические поля должны быть внутри него.

companion object {
    @JvmField
    val CREATOR: Parcelable.Creator<SDFileDir> = ...
    val serialVersionUid: Long = 123
}

Есть еще одна вещь: аннотация @JvmField для правильной работы с Java.

0 голосов
/ 06 ноября 2019

Я могу предложить два решения этой проблемы:

  1. Как сказал @Ircover - вы можете объявить CREATOR (это просто поле static в Java) внутри вашего companion objectвместе с константами, но вам нужно пометить аннотацией @JvmField, чтобы она работала как целочисленная (как она вызывается из Java) ..
  2. Вам не обязательно нужен companion object для постоянного значения, его (он не будет работать с serialVersionUid в вашем случае, так как он ДОЛЖЕН находиться внутри класса для работы сериализации Java) может быть перемещен в отдельный object, в companion objectдругого класса или даже внутри любого .kt тела файла (вне класса) ..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...