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