Приведи пример нарушения принципа подстановки в Android SDK

Ответ

Нарушение принципа подстановки Лисков (LSP) можно наблюдать в ListView и RecyclerView.

Пример:

val listView: ListView = findViewById(R.id.listView)
listView.adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, items)

// Нарушение LSP: RecyclerView.Adapter несовместим с ListView.Adapter
val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
recyclerView.adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, items) // Ошибка компиляции

Хотя оба адаптера служат одной цели, они не взаимозаменяемы из-за разных интерфейсов. Это нарушает LSP, так как подкласс (RecyclerView.Adapter) не может заменить базовый (ListView.Adapter).

Ответ 18+ 🔞

Да ты посмотри на эту дичь! Сидишь такой, пишешь код, и тут — бац! — принцип подстановки Лисков накрылся медным тазом. Прямо как на примере этих двух упырей, ListView и RecyclerView.

Вот смотри, ёпта, в чём прикол. Оба адаптера вроде бы для одного и того же созданы — данные в списке показывать. Но нет же, блядь! Разработчики Android, видимо, в тот день ебать копать решили, а не архитектуру продумывать.

Сам пример, где всё и посыпалось:

val listView: ListView = findViewById(R.id.listView)
listView.adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, items)

// А вот тут начинается пиздец и нарушение LSP
val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
recyclerView.adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, items) // Ошибка компиляции! Ёперный театр!

Вот и весь цирк. Ожидаешь ты, что раз уж RecyclerView — это такой продвинутый наследник ListView, то и адаптер от старшего брата должен подойти. Ан хуй там! Получается классическое нарушение принципа: объект (RecyclerView.Adapter) не может спокойно заменить объект своего предполагаемого родителя (ListView.Adapter), хотя по смыслу должен бы.

Короче, доверия ебать ноль к такой архитектуре. Хотел просто поменять виджет в разметке, а получаешь овердохуища ошибок и головной боли. Сам от себя охуеешь, когда пытаешься старый код с ListView на RecyclerView перевести. Чистая хитрая жопа, а не принцип подстановки.