169 похожих чатов

Всех приветствую. У меня есть три адаптера. Первый наследуется от

адаптера RecyclerView,второй наследуется от первого,и третьи тоже наследуется от первого,поскольку особых отличий,кроме разметки,там нет. Для каждого фрагмента я определяю адаптер своего типа (у фрагментов есть тоже своё наследование,т.е один наследуется от другого). Но почему-то при выполнении кода:

@Override
protected RecyclerView.Adapter<?> getAdapter() {
return (AdapterTags)super.getAdapter();
}

возникает ClassCastException. Но он не должен возникать,т.к один адаптер наследуется от другого. Конечно можно сразу вызвать конструктор класса AdapterTags с двумя аргументами: списком и слушателем,но тогда мой код будет дублироваться в двух классах,кроме типа адаптера. Конечно можно всё запихнуть в один адаптер,но тогда,на мой взгляд,мой код будет менее гибким. Подскажите пожалуйста,как обойти это исключение. Заранее благодарю всех за помощь.

20 ответов

10 просмотров

судя по ошибке и тому что я нагуглил, у тебя super.getAdapter() не является экземпляром AdapterTags попробуй посмотреть что возвращается сделай там условие if (adapter)

попробуй посмотреть что тебе возвращается в super.getAdapter() val adapter = super.getAdapter() if (adapter is AdapterTags) {

это из того что я нагуглил ну только на kotlin коде, а то хз как у тебя будет работать вроде вместо is там instaneof

Саша-Козловский Автор вопроса
Сорян Безобидович
попробуй посмотреть что тебе возвращается в super....

Ну вообще исходный метод возвращает AdapterCategories,от которого и наследуется AdapterTags. protected RecyclerView.Adapter<?> getAdapter() { return new AdapterCategories(all, new OnItemClickListener() { … } });

просто ты получается в функции getAdapter возвращаешь общий класс адаптера и пытаешься привести возвращаемое значение к adapterTags, а он не является экземпляром общего класса адаптера поэтому и ошибка ClassCastExeption

Саша-Козловский Автор вопроса
Сорян Безобидович
просто ты получается в функции getAdapter возвраща...

Но ведь он же наследуется от класса AdapterCategories. Как же тогда правильно поступить? Я,конечно,могу вернуть AdapterTags,но тогда мой код будет дублироваться. Тогда придётся,наверное,создать отдельный метод для установки слушателя,и в другом классе использовать супер версию этого метода,либо всё-таки продублировать код,что мне лично не очень хочется делать.

Саша Козловский
Но ведь он же наследуется от класса AdapterCategor...

если честно не знаю как у тебя устроен весь код, но по моему мнению, можно просто создать 3 адаптера которые наследуются от базового адаптера каждый

Сорян Безобидович
если честно не знаю как у тебя устроен весь код, н...

и обрабатывать их по своему если они отличаются

Саша-Козловский Автор вопроса
Сорян Безобидович
если честно не знаю как у тебя устроен весь код, н...

У меня и есть три адаптера,но только один наследуется от базового,а два остальных от первого.

Саша Козловский
У меня и есть три адаптера,но только один наследуе...

а в чем надобность наследоваться от первого у двух последующих?

Саша-Козловский Автор вопроса
Сорян Безобидович
а в чем надобность наследоваться от первого у двух...

Потому что разметка одна и та же. К тому же мне достаточно выводить toString у объекта. Если нужно,я могу просто установить другой layout для других адаптеров,используя мой соответствующий метод.

Саша-Козловский Автор вопроса

И тут такой сюрприз...

Саша Козловский
И тут такой сюрприз...

ну тогда тебе надо возвращать не дочерний класс AdapterTags а именно базовый(как я понял это у тебя AdapterCategories)

Сорян Безобидович
ну тогда тебе надо возвращать не дочерний класс Ad...

просто пишут что нельзя возвращать подклассы в суперреализации getAdapter()

Саша-Козловский Автор вопроса
Сорян Безобидович
ну тогда тебе надо возвращать не дочерний класс Ad...

Но вернув базовый клас,есть риск утратить реализацию методов дочернего.

Саша Козловский
Но вернув базовый клас,есть риск утратить реализац...

так вроде ж у тебя 1 базовый класс, в нем и должны быть все методы которые тебе могут понадобиться

Саша-Козловский Автор вопроса
Сорян Безобидович
так вроде ж у тебя 1 базовый класс, в нем и должны...

Так в дочерних классах может отличатся их реализация.

Саша Козловский
Так в дочерних классах может отличатся их реализац...

ну так или иначе, в супер реализации getAdapter() можно взять только базовый класс, дочерние будут вызывать ошибку ClassCastExeption

Саша-Козловский Автор вопроса
Сорян Безобидович
ну так или иначе, в супер реализации getAdapter() ...

В общем пока что просто вернул новый экземпляр AdapterTags,продублировав код и всё работает.

Саша Козловский
В общем пока что просто вернул новый экземпляр Ada...

из того что я почитал пока все это гуглил, нужно делать базовый класс достаточно гибким для того чтобы от него наследоваться так что пересмотри как у тебя задизайнен базовый класс, мб его переделать стоит если ты все по SOLID делаешь

Похожие вопросы

Обсуждают сегодня

Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Добрый день подскажите пожалуйста может кто то сталкивался с ошибками Sentry 22.10.0 развернутым из helm чарт в Kubernetes? Изначально 3 дня назад очень стало много событий ух...
Tire4 Finist Devops
1
всем привет почти закончил курс После него можно писать свою операционку? Какие библиотеки надо использовать и куда дальше копать для изучения
Linus
22
почому оно не работает?
Vi Chapmann ٩( 💢•̀ з•́)و Chapmann
19
Карта сайта