Каковы различия и сходства между чертами Scala и интерфейсами Java 8?
Я новичок в Scala начал изучать язык для удовольствия, и я все еще пытаюсь обнять его. Мое понимание черт Scala заключается в том, что они похожи на интерфейсы Java, за исключением того, что некоторые методы могут иметь реализацию.
Java 8 добавляет интерфейсы, которые могут иметь методы по умолчанию, где может быть реализована реализация.
Каковы сходства и различия между интерфейсами Java 8 и чертами Scala?
Ответы
Ответ 1
Мотивации для методов Java 8 'по умолчанию и Scala отличаются.
Первая была представлена для поддержки безопасной эволюции API и ограниченной формы множественного наследования. При использовании функциональных идиом функционального программирования в Project Lambda было полезно добавить, например, метод forEach(lambda)
к интерфейсу java.util.Collection
без изменения всех возможных исполнителей (чего фактически невозможно обойти, не нарушая обратной совместимости). В качестве побочного эффекта это также предложило форму mixin composition.
Scala черты были разработаны с нуля как строительные блоки для компоновки составных компонентов. Они имеют множественное наследование и не имеют проблемы с алмазами, строгие правила оценки порядка смешивания из-за линеаризации. Они также поддерживают состояние, могут ссылаться на класс реализации и устанавливать ограничения на какой тип может смешиваться в них. Посмотрите на коллекцию коллекций Scala, где черты используются полностью.
Ответ 2
Обратите внимание, что scala 2.12.0 RC1 (сентябрь 2016 г.), Trait
теперь компилируется в интерфейс.
Scala 2.12 - все о оптимальном использовании новых функций Java 8s
С Java 8, позволяющим использовать конкретные методы в интерфейсах, Scala 2.12 способен скомпилировать признак с одним интерфейсом.
Раньше признак представлялся как класс, в котором реализованы реализации метода и интерфейс.
Обратите внимание, что компилятор по-прежнему имеет довольно много магии для выполнения за кулисами, поэтому необходимо проявлять осторожность, если черта должна быть реализована на Java.
(Короче говоря, если в черте какой-либо из следующих подклассов требуется синтетический код: определение полей, вызов супер, операторов инициализатора в теле, расширение класса, полагающееся на линеаризацию, чтобы найти реализации в правой супер-характеристике.)
Подробнее см. scala PR 5003.
Ответ 3
При сходстве оба метода могут иметь методы по умолчанию,
Отличия, мы можем добавлять черты только к экземпляру, а не ко всему классу. Пример:
trait A { def m = ??? }
class B
new B() with A
Как мудрый, мы можем продолжать добавлять уровни признаков в экземпляр.