ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ, написанной Peter Verhas ΠΎΡ‚ апрСля 2014 Π³ΠΎΠ΄Π°. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Java 8: Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈ Ρ‡Π΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚? - 1ΠžΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: Ρ‚Π΅Ρ€ΠΌΠΈΠ½ "default method" Π² Java Ρ‚ΠΎΠ»ΡŒΠΊΠΎ появился ΠΈ я Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Π΅ΡΡ‚ΡŒ Π»ΠΈ для Π½Π΅Π³ΠΎ ΡƒΡΡ‚ΠΎΡΠ²ΡˆΠΈΠΉΡΡ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π½Π° русский. Π― Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ "ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ", хотя ΠΈ Π½Π΅ ΡΡ‡ΠΈΡ‚Π°ΡŽ Π΅Π³ΠΎ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ. ΠŸΡ€ΠΈΠ³Π»Π°ΡˆΠ°ΡŽ ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, с Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ Java 8, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² интСрфСйсы Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ этот интСрфСйс остаСтся совмСстимым с классами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ, Ссли Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ мноТСство программистов ΠΎΡ‚ КиСва Π΄ΠΎ Нью-Π™ΠΎΡ€ΠΊΠ°. Π”ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π° Java 8, Ссли Π²Ρ‹ описали интСрфСйс Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, Π²Ρ‹ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π΅ рискуя, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π΅ с вашим интСрфСйсом, Π½Π΅ сломаСтся ΠΏΡ€ΠΈ Π΅Π³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ, Π² Java 8 этого ΠΌΠΎΠΆΠ½ΠΎ большС Π½Π΅ Π±ΠΎΡΡ‚ΡŒΡΡ? НСт, нСльзя. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² интСрфСйс ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСвозмоТности использования Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… классов. Π”Π°Π²Π°ΠΉΡ‚Π΅ сначала посмотрим Π½Π° Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ стороны ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’ Java 8 ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ прямо Π² интСрфСйсС. (БтатичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² интСрфСйсС Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ, Π½ΠΎ это другая история.) ΠœΠ΅Ρ‚ΠΎΠ΄, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² интСрфСйсС, называСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ обозначаСтся ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом default. Если класс Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚, Π½ΠΎ Π½Π΅ обязан, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π² интСрфСйсС. Класс наслСдуСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ классы ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ интСрфСйса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚.

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΎΠ΅ наслСдованиС?

ВсС услоТняСтся, Ссли Π½Π΅ΠΊΠΈΠΉ класс Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ (скаТСм, Π΄Π²Π°) интСрфСйса, Π° ΠΎΠ½ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Какой ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² унаслСдуСт класс? ΠžΡ‚Π²Π΅Ρ‚ β€” Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ (Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π»ΠΈΠ±ΠΎ унаслСдовав Π΅Π³ΠΎ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса). Битуация Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π°, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ интСрфСйс ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ этот ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ являСтся абстрактным. Java 8 стараСтся Π±Ρ‹Ρ‚ΡŒ дисциплинированной ΠΈ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹Ρ… ситуаций. Если ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π² ΠΎΠ΄Π½ΠΎΠΌ интСрфСйсС, Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ классом Π½Π΅ наслСдуСтся - Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции. Π₯отя, ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, Ссли ваш класс ΡƒΠΆΠ΅ скомпилирован. Π’ этом ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ Java 8 нСдостаточно стойка. На Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ свои ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹, Π² обсуТдСниС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… я Π½Π΅ Ρ…ΠΎΡ‡Ρƒ Π²Π΄Π°Π²Π°Ρ‚ΡŒΡΡ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Ρ€Π΅Π»ΠΈΠ· Java ΡƒΠΆΠ΅ Π²Ρ‹ΡˆΠ΅Π» ΠΈ врСмя для дискуссий ΡƒΠΆΠ΅ Π΄Π°Π²Π½ΠΎ ΠΏΡ€ΠΎΡˆΠ»ΠΎ ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅, здСсь для Π½ΠΈΡ… Π½Π΅ мСсто).
  • Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° интСрфСйса, ΠΈ класс Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΈΡ… ΠΎΠ±Π°.
  • Один ΠΈΠ· интСрфСйсов Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ m().
  • Π’Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ всС интСрфСйсы ΠΈ класс.
  • Π’Ρ‹ мСняСтС интСрфСйс, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° m(), объявляя Π΅Π³ΠΎ ΠΊΠ°ΠΊ абстрактный ΠΌΠ΅Ρ‚ΠΎΠ΄.
  • ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ интСрфСйс.
  • ЗапускаСтС класс.
ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Java 8: Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈ Ρ‡Π΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚? - 2Π’ этом случаС класс Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΅Π³ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ интСрфСйсами, Π½ΠΎ ΠΎΠ½ Π±Ρ‹Π» скомпилирован со старыми вСрсиями ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π’Π΅ΠΏΠ΅Ρ€ΡŒ
  • ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ интСрфСйс с абстрактным ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ m() ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
  • Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ интСрфСйс.
  • ЗапуститС класс: ошибка.
Когда Π΅ΡΡ‚ΡŒ Π΄Π²Π° интСрфСйса, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ Π² классС, Ссли ΠΎΠ½ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ самим классом (ΠΎΠΏΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈ, ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π»ΠΈΠ±ΠΎ унаслСдовано ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса). ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Java 8: Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈ Ρ‡Π΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚? - 3Класс совмСстим. Он ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ с ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ интСрфСйсом. Он ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°ΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² ΠΎΠ±ΠΎΠΈΡ… интСрфСйсах.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Java 8: Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈ Ρ‡Π΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚? - 4Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΡˆΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅, я создал тСстовый ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ для класс C.java ΠΈ 3 ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° для интСрфСйсов Π² Ρ„Π°ΠΉΠ»Π°Ρ… I1.java ΠΈ I2.java. ΠšΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ для тСста содСрТит исходный ΠΊΠΎΠ΄ класса C.java. ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ base содСрТит Π²Π΅Ρ€ΡΠΈΡŽ интСрфСйсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ подходят для выполнСния ΠΈ компиляции: интСрфСйс I1 ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ m(); интСрфСйс I2 ΠΏΠΎΠΊΠ° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π’ классС Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ main, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. Он провСряСт, Ссли Π»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ, Ρ‚Π°ΠΊ ΠΈ Π±Π΅Π· Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° m().
~/github/test$ cat C.java
public class C implements I1, I2 {
  public static void main(String[] args) {
    C c = new C();
    if( args.length == 0 ){
      c.m();
    }
  }
}
~/github/test$ cat base/I1.java
public interface I1 {
  default void m(){
    System.out.println("hello interface 1");
  }
}
~/github/test$ cat base/I2.java
public interface I2 {
}
МоТно ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ класс ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.
~/github/test$ javac -cp .:base C.java
~/github/test$ java -cp .:base C
hello interface 1
ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ compatible содСрТит Π²Π΅Ρ€ΡΠΈΡŽ интСрфСйса I2, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ m() абстрактным, Π° Ρ‚Π°ΠΊΠΆΠ΅, ΠΏΠΎ тСхничСским ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡƒΡŽ копию I1.java.
~/github/test$ cat compatible/I2.java

public interface I2 {
  void m();
}
Π’Π°ΠΊΠΎΠΉ Π½Π°Π±ΠΎΡ€ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для компиляции класса C:
~/github/test$ javac -cp .:compatible C.java
C.java:1: error: C is not abstract and does not override abstract method m() in I2
public class C implements I1, I2 {
       ^
1 error
Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ± ошибкС ΠΎΡ‡Π΅Π½ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ρƒ нас Π΅ΡΡ‚ΡŒ C.class с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ компиляции ΠΈ, Ссли ΠΌΡ‹ скомпилируСм интСрфСйсы Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ compatible, Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²Π° интСрфСйса , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ всС Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для запуска класса:
~/github/test$ javac compatible/I*.java
~/github/test$ java -cp .:compatible C
hello interface 1
Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ β€” wrong β€” содСрТит Π²Π΅Ρ€ΡΠΈΡŽ I2, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π°ΠΊΠΆΠ΅ объявлСн ΠΌΠ΅Ρ‚ΠΎΠ΄ m():
~/github/test$ cat wrong/I2.java
public interface I2 {
  default void m(){
    System.out.println("hello interface 2");
  }
}
МоТно Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΌΡƒΡ‡ΠΈΡ‚ΡŒΡΡ с компиляциСй. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ объявлСн Π΄Π²Π°ΠΆΠ΄Ρ‹, класс всС Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° m(). Π’ΠΎΡ‚ для Ρ‡Π΅Π³ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки:
~/github/test$ javac wrong/*.java
~/github/test$ java -cp .:wrong C
Exception in thread "main" java.lang.IncompatibleClassChangeError: Conflicting default methods: I1.m I2.m
    at C.m(C.java)
    at C.main(C.java:5)
~/github/test$ java -cp .:wrong C x
~/github/test$

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Когда Π²Ρ‹ пСрСноситС Π²Π°ΡˆΡƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π² Java 8 ΠΈ мСняСтС ваши интСрфСйсы, добавляя Π² Π½ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, скорСС всСго, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Ρƒ вас Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚. Π’ΠΎ всяком случаС, Π½Π° это Π½Π°Π΄Π΅ΡŽΡ‚ΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ для Java 8, добавляя Ρ„ΡƒΠ½ΠΊΡ†ΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π°ΡˆΡƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, ΠΏΠΎΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΅Π΅ для Java 7, Π³Π΄Π΅ Π½Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Если нСсколько Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ вмСстС, Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° Π΅ΡΡ‚ΡŒ. Как Π΅Π³ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ? ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ API вашСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅. НС Ρ€Π°ΡΡΠ»Π°Π±Π»ΡΠΉΡ‚Π΅ΡΡŒ, полагаясь Π½Π° возмоТности ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Они - это ΠΊΡ€Π°ΠΉΠ½Π΅Π΅ срСдство. Π’Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΈΠΌΠ΅Π½Π°, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ интСрфСйсами. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° для Java с использованиСм этой Ρ„ΠΈΡ‡ΠΈ.