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

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

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

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

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

20 ответов

32 просмотра

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

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

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

Ребят в СИ можно реализовать ООП?
Николай
33
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем доброго вечера. Разрабатываю 32 раз. приложение в Delphi. Столкнулся с тем, что стандартный  TFilestream  не работает с большим файлом > 2 ГБайт (после вызова функции see...
Vadim Gl
16
добрый день. Подскажите, есть сайт на 1.4.7 и я хочу обновиться, особо ничего не меняя. мне выбирать версию 1.4.35 или третью ветку? и можно ли обновлять "как есть", или нужно...
Digital Cat
12
У меня задача: написать брокер сообщений. Очереди и потребители. Очереди поддерживают приоритеты. Очередь отдает сообщения, только обработчикам с соответствующими характеристи...
Aleksandr Filippov
2
народ, плиз хелп, всю голову сломал себе уже... разве может быть так, что GetProcAddress( GetModuleHandle( "kernel32.dll" ), "SetThreadDescription" ) вернёт ненулевое значение...
Iluha Companets
12
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Всем доброго вечера. Разрабатываю 32 раз. приложение в Delphi. Столкнулся с тем, что стандартный TFilestream не работает с большим файлом > 2 ГБайт (после вызова функции see...
Vadim Gl
8
Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
14
Карта сайта