У меня есть следующий код Котлина
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 и предназначены для параметра функции, а не для переменной-члена.
Я не думаю, что вы просмотрели все ответы. stackoverflow.com/a/45351041/1197251. Вы создали интерфейс, у которого есть свойство childFragmentManager
, которое в JVM преобразуется в getChildFragmentManager
, что конфликтует со свойством Fragment
getChildFragmentManger
. Назовите это как-нибудь по-другому.
Может быть актуально: stackoverflow.com/q/47504279/6395627
переименуйте переменную childFragmentManager во что-нибудь другое, например childFm
, reminderFragmentMager
, baseFragmentMager
и т. д.
Чтобы устранить ошибку «Случайное переопределение» для переменной-члена класса в Kotlin, вы можете явно реализовать свойство интерфейса в классе вместо его переопределения. Вот как вы можете это сделать:
interface ReminderHolderOwner {
val childFragmentManager: FragmentManager
}
class ReminderDialogFragment : DialogFragment(), ReminderHolderOwner {
override val childFragmentManager: FragmentManager by lazy {
super.getChildFragmentManager()
}
}
В этом коде вместо непосредственного переопределения свойства childFragmentManager вы используете делегат by lazy для его инициализации при первом доступе к нему. Это гарантирует, что свойство инициализируется только один раз, и позволяет избежать ошибки «Случайное переопределение».
Вы создали этот ответ с помощью ChatGPT?
Нет. Это не решает упомянутую проблему.