Каковы различия и сходства между чертами 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, в которой тщательно используются трейты.


Не могли бы вы подробнее рассказать об этом: «Свойства 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 подробнее о разнице в реализации.


4

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

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

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

new B() with A 

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.