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

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

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

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

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

20 ответов

50 просмотров

судя по ошибке и тому что я нагуглил, у тебя 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 делаешь

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта