Каковы различия и сходства между чертами Scala и интерфейсами Java 8?

84

Я новичок в Scala, начал изучать язык для развлечения и все еще пытаюсь осмыслить его. Насколько я понимаю, черты Scala похожи на интерфейсы Java, за исключением того, что некоторые методы могут иметь реализацию.

Java 8 добавляет интерфейсы, которые могут иметь методы по умолчанию, где может быть предоставлена ​​реализация.

В чем сходство и различие между интерфейсами Java 8 и особенностями Scala?

амс
источник
4
зайдите на этот сайт, он может вам помочь infoq.com/articles/java-8-vs-scala
akki0996,
3
tl; dr: Основным мотиватором для виртуальных методов расширения [методов по умолчанию] является эволюция API. Приятным побочным эффектом является то, что они предлагают форму множественного наследования, которое ограничено поведением. Черты в Scala обеспечивают множественное наследование не только поведения, но и состояния. Помимо наследования состояния и поведения, трейты предлагают средство для получения ссылки на реализующий класс ... трейты [Scala] предлагают более богатый набор функций, чем методы виртуального расширения [Java 8].
Brice Roncace

Ответы:

46

Мотивы использования методов по умолчанию в Java 8 и особенностей Scala различаются.

Первый был введен для поддержки безопасной эволюции API и ограниченной формы множественного наследования. Используя идиомы функционального программирования в Project Lambda, было полезно добавить, например, forEach(lambda)метод java.util.Collectionинтерфейса без изменения всех возможных средств реализации (что на самом деле невозможно сделать без нарушения обратной совместимости). В качестве побочного эффекта это также предлагало форму композиции миксина .

Типажи Scala были разработаны с нуля как строительные блоки для составления модульных компонентов. Они дружественны к множественному наследованию и не имеют проблем с ромбами, поскольку имеют строгие правила оценки подстановок из-за линеаризации. Они также поддерживают состояние, могут ссылаться на реализующий класс и накладывать ограничения на то, какой тип может их смешивать. Взгляните на библиотеку коллекций Scala, в которой тщательно используются трейты.

Tvaroh
источник
Не могли бы вы подробнее рассказать об этом: «Свойства Scala были разработаны с нуля как строительные блоки для составления модульных компонентов». ?
Adelin
14

Обратите внимание , что с Scala 2.12.0 RC1 (сентябрь 2016) , в Traitнастоящее время составляет в интерфейс.
Scala 2.12 - это оптимальное использование новых функций Java 8

Благодаря тому, что Java 8 позволяет использовать конкретные методы в интерфейсах, Scala 2.12 может компилировать черту в один интерфейс.

Раньше черта была представлена ​​как класс, содержащий реализации метода и интерфейс .
Обратите внимание, что у компилятора все еще есть немало волшебства, которое нужно выполнять за кулисами, поэтому следует проявлять осторожность, если черта предназначена для реализации в Java.
(Вкратце, если для свойства какой-либо из следующих подклассов требуется синтетический код: определение полей, вызов super, операторы инициализатора в теле, расширение класса, использование линеаризации для поиска реализаций в правильном супер-типаже.)

См. Scala PR 5003 подробнее о разнице в реализации.

VonC
источник
4

По схожести оба могут иметь методы по умолчанию,

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

trait A { def m = ??? }
class B 

new B() with A 

Точно так же мы можем продолжать добавлять слои характеристик к экземпляру.

Ашок Вагмаре
источник