Существует различие между:
- Логическое наследование (интерфейс общих ресурсов)
- Наследование «Код» при совместном использовании кода между классами
ЛогическиLinkedList
не является AbstractList
, поскольку оно не абстрактно.Однако, с точки зрения кода, выгодно поделиться некоторой реализацией методов List
, поскольку они могут быть реализованы в терминах других, обычно с той же эффективностью (например, isEmpty
может быть реализовано как size() == 0
).
Некоторые платформы, такие как GObject (или в некоторой степени Haskell - хотя это не язык ОО и многие вещи совершенно разные), допускают реализацию методов по умолчанию в интерфейсе, который его определяет.
Однакоэто не относится к Java, который использует классы Abstract*
для повторного использования кода.Filter*Stream
не столько определяет, что выходные данные отправляются куда-то (поскольку весь смысл ввода / вывода Java заключается в том, что производителю / получателю все равно), но он используется для повторного использования общего кода.