Каковы различия и сходства между чертами 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 

Как мудрый, мы можем продолжать добавлять уровни признаков в экземпляр.