Как устранить «Случайное переопределение: следующие объявления имеют одинаковую подпись JVM» для переменной-члена класса?

У меня есть следующий код Котлина

interface ReminderHolderOwner {
    val childFragmentManager: FragmentManager
}

class ReminderDialogFragment : DialogFragment(), ReminderHolderOwner {
    override val childFragmentManager: FragmentManager
        get() = super.getChildFragmentManager()

Я получаю сообщение об ошибке

Случайное переопределение: следующие объявления имеют одну и ту же JVM. подпись (getChildFragmentManager()Landroidx/fragment/app/FragmentManager;): fun <get-childFragmentManager>(): FragmentManager определён в com.xxx.input.reminder.ReminderDialogFragment fun getChildFragmentManager(): FragmentManager определен в com.xxx.input.reminder.ReminderDialogFragment

Могу ли я узнать, как можно устранить такую ​​ошибку? Спасибо.

Пожалуйста, не закрывайте ветку. Это не дублированный вопрос.

Применение @get:JvmName("getChildFragmentManager") не решит проблему. Мы получим ошибку

annotation is not applicable to this declaration

Ответ представлен в разделе Случайное переопределение: следующие объявления имеют одинаковую подпись JVM и предназначены для параметра функции, а не для переменной-члена.

Нет. Это не решает упомянутую проблему.

Cheok Yan Cheng 10.05.2024 07:47

Я не думаю, что вы просмотрели все ответы. stackoverflow.com/a/45351041/1197251. Вы создали интерфейс, у которого есть свойство childFragmentManager, которое в JVM преобразуется в getChildFragmentManager, что конфликтует со свойством FragmentgetChildFragmentManger. Назовите это как-нибудь по-другому.

dominicoder 10.05.2024 07:56

Может быть актуально: stackoverflow.com/q/47504279/6395627

Slaw 10.05.2024 08:19

переименуйте переменную childFragmentManager во что-нибудь другое, например childFm, reminderFragmentMager, baseFragmentMager и т. д.

daya pangestu 10.05.2024 14:46
0
4
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы устранить ошибку «Случайное переопределение» для переменной-члена класса в Kotlin, вы можете явно реализовать свойство интерфейса в классе вместо его переопределения. Вот как вы можете это сделать:

interface ReminderHolderOwner {
    val childFragmentManager: FragmentManager
}

class ReminderDialogFragment : DialogFragment(), ReminderHolderOwner {
    override val childFragmentManager: FragmentManager by lazy {
        super.getChildFragmentManager()
    }
}

В этом коде вместо непосредственного переопределения свойства childFragmentManager вы используете делегат by lazy для его инициализации при первом доступе к нему. Это гарантирует, что свойство инициализируется только один раз, и позволяет избежать ошибки «Случайное переопределение».

Вы создали этот ответ с помощью ChatGPT?

DarkBee 29.05.2024 08:30

Другие вопросы по теме