Які відмінності та подібності між рисами Scala та інтерфейсами Java 8?


84

Я новачок у тому, що Скала почала вивчати цю мову для розваги, і я все ще намагаюся її розібратися. Я розумію риси 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.
(Коротко кажучи, якщо якась ознака виконує будь-який із наступних її підкласів, вимагає синтетичного коду: визначення полів, виклик супер, оператори ініціалізатора в тілі, розширення класу, покладання на лінеаризацію для пошуку реалізацій у правильній супер-ознаці.)

Див. 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.