Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…, generic

Начиная с Java 5 появились Π½ΠΎΠ²Ρ‹Π΅ возмоТности для программирования, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт отнСсти ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ программирования, названная Π² Java generic. Π­Ρ‚Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. БоотвСтствСнно, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ становятся Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌΠΈ ΠΈ ΠΏΡ€ΠΎΡ‰Π΅ Π² ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅.

generic ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΠ΅ΠΉ с конструкциСй «Π¨Π°Π±Π»ΠΎΠ½ΠΎΠ²»(template) Π² Π‘++. ОТидалось, Ρ‡Ρ‚ΠΎ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Java Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ C++. На Π΄Π΅Π»Π΅ оказалось, Ρ‡Ρ‚ΠΎ различия ΠΌΠ΅ΠΆΠ΄Ρƒ generic’Π°ΠΌΠΈ Java ΠΈ шаблонами Π‘++ довольно Π²Π΅Π»ΠΈΠΊΠΈ. Π’ основном generic Π² Java получился ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ ΠΈΡ… C++-Π°Π½Π°Π»ΠΎΠ³, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ Π½Π΅ являСтся ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠΉ вСрсиСй шаблонов C++ ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ряд Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΉ. Π’Π°ΠΊ, Π² языкС появилось нСсколько Π½ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ, ΠΊΠ°ΡΠ°ΡŽΡ‰ΠΈΡ…ΡΡ generic’ΠΎΠ² – это маски ΠΈ ограничСния.

Рассмотрим 2 ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±Π΅Π· использования ΠΈ с использованиСм generic. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±Π΅Π· использования generic с ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ° (java casting):

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ программист Π·Π½Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΠΌΡ‹ΠΉ Π² List’e. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° («java casting»). ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ лишь Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ next() Π²Π΅Ρ€Π½Ρ‘Ρ‚ Object, Π½ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ присвоСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° Integer ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΈ бСзопасным, трСбуСтся java casting. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ возмоТности появлСния ошибки «Runtime Error» ΠΈΠ·-Π·Π° Π½Π΅Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.

Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос: «ΠšΠ°ΠΊ с этим Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ? Каким ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ List для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…?». Π”Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ generic. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ generic Π±Π΅Π· привСдСния Ρ‚ΠΈΠΏΠΎΠ².

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ вмСсто привСдСния ΠΊ Integer, Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ‚ΠΈΠΏ списка List. Π’ этом Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ сущСствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅, ΠΈ компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π½Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ Π²ΠΎ врСмя компиляции Π²ΠΎ всСм ΠΊΠΎΠ΄Π΅. Π­Ρ„Ρ„Π΅ΠΊΡ‚ ΠΎΡ‚ generic особСнно проявляСтся Π² ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…: ΠΎΠ½ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π² Ρ†Π΅Π»ΠΎΠΌ.

Бвойства Generics

ОбъявлСниС generic-класса

ΠžΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ generic-класс совсСм нСслоТно. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠ³ΠΎ объявлСния :

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования generic-класса GenericSample :

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ generic

1. Wildcard

Рассмотрим ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ dump, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² пСрСдаСтся Collection для Π²Ρ‹Π²ΠΎΠ΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² консоль.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° состоит Π² Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎ данная рСализация ΠΊΠΎΠ΄Π° Π½Π΅ эффСктивна, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Collection Π½Π΅ являСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠ΅ΠΉ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ, Π³Ρ€ΡƒΠ±ΠΎ говоря Collection ΠΈΠΌΠ΅Π΅Ρ‚ ограничСния. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Wildcard («?»), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ограничСния Π² использовании, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ соотвСтствиС с Π»ΡŽΠ±Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ, ΠΈ Π² этом Π΅Π³ΠΎ ΠΏΠ»ΡŽΡΡ‹. И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ это с Π»ΡŽΠ±Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ.

2. Bounded Wildcard

Рассмотрим ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ draw, которая рисуСт Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ свойства родитСля Shape. Допустим Ρƒ Shape Π΅ΡΡ‚ΡŒ наслСдник Circle, ΠΈ Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ «ΠΈΠ·ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ».

ИспользованиС позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Cycle ΠΈ всСх Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠΎΠ² Π²ΠΏΠΎΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ Object.

3. Generic ΠΌΠ΅Ρ‚ΠΎΠ΄

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ addAll, которая Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ массив Π΄Π°Π½Π½Ρ‹Ρ… Object[] ΠΈ пСрСносит Π΅Π³ΠΎ Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ Collection

Ошибки, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ Π² послСдних строках связаны с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ нСльзя просто Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Object Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ нСизвСстного Ρ‚ΠΈΠΏΠ°. Бпособ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ являСтся использованиС «generic ΠΌΠ΅Ρ‚ΠΎΠ΄Π°«. Для этого ΠΏΠ΅Ρ€Π΅Π΄ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ.

Но всС Ρ€Π°Π²Π½ΠΎ послС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ останСтся ошибка Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ строчкС :

Допустим имССтся функция, которая Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ блиТайший ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ Glyph ΠΈΠ· Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ. Glyph – это Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒΡΡ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ количСство ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² этого Ρ‚ΠΈΠΏΠ°. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒΡΡ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ количСство ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ, хранящих элСмСнты, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… соотвСтствуСт ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· этих ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ². Π₯ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция ΠΌΠΎΠ³Π»Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со всСми ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ коллСкциями, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° элСмСнт, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ совпадал Π±Ρ‹ с Ρ‚ΠΈΠΏΠΎΠΌ элСмСнта ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, Π° Π½Π΅ приводился ΠΊ Glyph. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΉ:

Ѐункция выглядит Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ, Π½ΠΎ, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π½Π΅ лишСна нСдостатков. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ любого Ρ‚ΠΈΠΏΠ°. Π­Ρ‚ΠΎ услоТняСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, пороТдая Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠ° элСмСнта. Π‘ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС встаСт Π½Π° свои мСста, ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ, элСмСнты ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ интСрфСйс Glyph. generic сдСлал своС Π΄Π΅Π»ΠΎ, ΠΊΠΎΠ΄ получился Π±ΠΎΠ»Π΅Π΅ типобСзопасным.

4. Generic-классы

НаслСдованиС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² generic-классов:

Как Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ…, Ρ‚Π°ΠΊ ΠΈ Π² классах ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ интСрфСйса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ generic-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π­Ρ‚ΠΎ дСлаСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ синтаксиса:

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ generic-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ интСрфСйс Glyph, Π½ΠΎ ΠΈ MoveableGlyph. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° количСство интСрфСйсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Π½Π΅Ρ‚. Но Π² класс ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½, Ρ‚.ΠΊ. Π² Java Π½Π΅Ρ‚ мноТСствСнного наслСдования. Π’ΠΈΠΏΡ‹ Π² этом спискС ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ generic-Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, Π½ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ интСрфСйс Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ Π² спискС Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°, Π΄Π°ΠΆΠ΅ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ:

5. Bounded type argument

ΠœΠ΅Ρ‚ΠΎΠ΄ копирования ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ

6. Lower bounded wildcard

ΠœΠ΅Ρ‚ΠΎΠ΄ нахоТдСния максимума Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ

6. Wildcard Capture

РСализация ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Swap Π² List

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ generic

НСвозмоТно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ массив generic’ΠΎΠ² :

НСвозмоТно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ массив generic-классов :

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²

Π’ Generics Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ, хранящийся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

НаслСдованиС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² generic’Π°Ρ…

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ generic-класса ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² throws позволяСт ΠΏΡ€ΠΈ описании абстрактного ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ класс ΠΈΠ»ΠΈ интСрфСйс, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Но ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Π² catch-выраТСниях нСльзя.

НСобходимо Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ наслСдником Throwable.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, generic-ΠΈ Π² Java ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ внСсли нСсколько интСрСсных ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ маски (wildcard) ΠΈ ограничСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ удобство ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΈ ΠΏΠΎΠΌΠΎΠ³Π»ΠΈ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Но, ΠΊΠ°ΠΊ ΠΈ любоС услоТнСниС языка, эти нововвСдСния Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΡΡŽΡ‚ Π΅Π³ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅. ПоявлСниС generic-ΠΎΠ² сдСлало язык Java Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ строгим; Ρ‚Π°ΠΊΠΈΠ΅ измСнСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΏΠΎΠ»ΡŒΠ·Ρƒ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Π² Java для самых ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ…: синтаксис, Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΈ Π΄ΠΈΠΊΠΈΠ΅ ΠΊΠ°Ρ€Ρ‚Ρ‹

РазбираСмся, Π·Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ ΠΈ ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π² свой ΠΊΠΎΠ΄.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java

Оля Π•ΠΆΠ°ΠΊ для Skillbox Media

Π£ нас Π² ΠΏΠ°Ρ€Π°Π΄Π½ΠΎΠΉ подъСздС рядом с ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΌΠΈ ящиками стоит ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΠ΄Π° Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ Π±ΡƒΠΌΠ°ΠΆΠ½Ρ‹ΠΉ спам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π²Ρ€Π΅Π΄ΠΈΡ‚Π΅Π»ΠΈ ΡƒΠΏΠΎΡ€Π½ΠΎ ΠΊΠ»Π°Π΄ΡƒΡ‚ Π² эти самыС ящики. Но Π² ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ΅ вмСстС с Π±ΡƒΠΌΠ°ΠΆΠΊΠ°ΠΌΠΈ Π»Π΅ΠΆΠ°Ρ‚ пустыС Π±ΡƒΡ‚Ρ‹Π»ΠΊΠΈ ΠΈ Π±Π°Π½ΠΊΠΈ, ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, Π° Π² Π½Ρ‹Π½Π΅ΡˆΠ½ΠΈΡ… рСалиях β€” Π΅Ρ‰Ρ‘ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ мСдицинскиС маски. ΠŸΠΎΡ‡Π΅ΠΌΡƒ люди Ρ‚Π°ΠΊ Π΄Π΅Π»Π°ΡŽΡ‚? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ содСрТимоС ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ Π²Ρ‹ ΠΎΡ‚Π²ΠΎΠ·ΠΈΡ‚Π΅ Π½Π° ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, Π° ΠΏΠ΅Ρ€Π΅Π΄ этим ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· приходится ΠΎΡ‚Π΄Π΅Π»ΡΡ‚ΡŒ Π±ΡƒΠΌΠ°Π³Ρƒ ΠΎΡ‚ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ мусора. НС Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ Π²Ρ‹ Π·Π°ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠΎΡ€ΠΎΠ±ΠΊΡƒ, которая Π½Π΅ даст ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² сСбя Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ Π±ΡƒΠΌΠ°Π³ΠΈ? Если ваш ΠΎΡ‚Π²Π΅Ρ‚ Β«Π΄Π°Β» β€” Π²Π°ΠΌ понравятся Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ (generics).

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java

ЀулстСк-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ. Π›ΡŽΠ±ΠΈΠΌΡ‹ΠΉ стСк: Java + Angular, Π½ΠΎ Π² Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π³ΠΎΡ‚ΠΎΠ²Π° ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ…ΠΎΡ‚ΡŒ Π½Π° языкС Ада.

Знакомимся с Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ°ΠΌΠΈ

Π”ΠΎ появлСния Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² программисты ΠΌΠΎΠ³Π»ΠΈ нСявно ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ класс, интСрфСйс ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с элСмСнтами ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° этот Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°:

Π—Π΄Π΅ΡΡŒ прСдполагаСтся, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ printSomething Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ со списком строк. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ ΠΎΠ± этом, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Ρ†ΠΈΠΊΠ»Π΅ всС элСмСнты приводятся (ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ) ΠΊ классу String, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π΅Ρ‰Ρ‘ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ length этого класса вызываСтся.

Но смотритС, Ρ‡Ρ‚ΠΎ сдСлали программисты Баша ΠΈ Маша, β€” ΠΎΠ½ΠΈ полСнились Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΠ»ΠΈ Π² список: ΠΎΠ΄ΠΈΠ½ β€” число, Π° вторая β€” экзСмпляр StringBuilder.

Π’ΠΎΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ тСстировщик Π½Π°Π·Π½Π°Ρ‡ΠΈΠ» Π±Π°Π³ Π½Π΅ ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ ΠΈΠ· Π½ΠΈΡ…, Π° ПашС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ написал ΠΌΠ΅Ρ‚ΠΎΠ΄ printSomething, β€” ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ошибка ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π²ΠΎ врСмя Π΅Π³ΠΎ выполнСния.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java

Паша быстро Π½Π°ΡˆΡ‘Π» истинных Π²ΠΈΠ½ΠΎΠ²Π½ΠΈΠΊΠΎΠ² ΠΈ попросил ΠΈΡ… ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ списка. Но Π½Π° Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅ Ρ€Π΅ΡˆΠΈΠ» ΠΏΠΎΠ΄ΡΡ‚Ρ€Π°Ρ…ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ситуаций ΠΈ пСрСписал ΠΌΠ΅Ρ‚ΠΎΠ΄ с использованиСм Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ². Π’ΠΎΡ‚ Ρ‚Π°ΠΊ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² массив нСстроковый элСмСнт, ошибка станСт Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎΠΉ сразу β€” Π΅Ρ‰Ρ‘ Π½Π° этапС компиляции.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ вСрсии Пашиного ΠΌΠ΅Ρ‚ΠΎΠ΄Π° item Π½Π΅ приводится насильно ΠΊ Ρ‚ΠΈΠΏΡƒ String. ΠœΡ‹ просто ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ элСмСнт списка, ΠΈ компилятор ΡΠΎΠ³Π»Π°ΡˆΠ°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ это, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ строка. Код стал ΠΌΠ΅Π½Π΅Π΅ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌ, Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ стало ΠΏΡ€ΠΎΡ‰Π΅.

ОбъявляСм Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-классы ΠΈ создаём ΠΈΡ… экзСмпляры

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚Ρƒ ΡΠ°ΠΌΡƒΡŽ ΠΊΠΎΡ€ΠΎΠ±ΠΊΡƒ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ шла Ρ€Π΅Ρ‡ΡŒ Π² Π½Π°Ρ‡Π°Π»Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ: создадим класс Box, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с элСмСнтами ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. ΠŸΡƒΡΡ‚ΡŒ для простоты Π² этой ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ΅ ΠΏΠΎΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ элСмСнт:

Π’ классС Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

Π’ΠΎ всСх случаях, ΠΊΡ€ΠΎΠΌΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° класса, символ T ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π±Π΅Π· ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобок, ΠΎΠ½ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ создадим ΠΊΠΎΡ€ΠΎΠ±ΠΊΡƒ для Π±ΡƒΠΌΠ°Π³ΠΈ. ΠŸΡƒΡΡ‚ΡŒ Π·Π° Π±ΡƒΠΌΠ°Π³Ρƒ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ класс Paper, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, экзСмпляр ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ создаётся Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ записи, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΊΠΎΡ€ΠΎΡ‡Π΅:

Π’Π°ΠΊ ΠΊΠ°ΠΊ слСва ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ компилятору, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½Π° ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ° ΠΈΠΌΠ΅Π½Π½ΠΎ для Π±ΡƒΠΌΠ°Π³ΠΈ, справа ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ Paper β€” компилятор «догадаСтся» ΠΎ Π½Ρ‘ΠΌ сам.

Π­Ρ‚ΠΎ Β«ΡƒΠ³Π°Π΄Ρ‹Π²Π°Π½ΠΈΠ΅Β» называСтся type inference β€” Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°, Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β« <>Β» β€” это diamond operator. Π•Π³ΠΎ Ρ‚Π°ΠΊ Π½Π°Π·Π²Π°Π»ΠΈ ΠΈΠ·-Π·Π° внСшнСго сходства с Π±Ρ€ΠΈΠ»Π»ΠΈΠ°Π½Ρ‚ΠΎΠΌ.

E β€” element, для элСмСнтов ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ;

K β€” key, для ΠΊΠ»ΡŽΡ‡Π΅ΠΉ map-структур;

V β€” value, для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ map-структур;

N β€” number, для чисСл;

T β€” type, для обозначСния Ρ‚ΠΈΠΏΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… классах;

S, U, V ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅ β€” ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π² Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-классС нСсколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-классы Ρ…ΠΎΡ€ΠΎΡˆΠΈ своСй ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ: с классом Box Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΡ€ΠΎΠ±ΠΊΡƒ для Π±ΡƒΠΌΠ°Π³ΠΈ, Π½ΠΎ ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ для сбора пластика ΠΈΠ»ΠΈ стСкла:

А ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΉΡ‚ΠΈ Π΅Ρ‰Ρ‘ дальшС ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-класс с двумя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ для ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ с двумя отсСками. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΠ±ΠΊΡƒ, Π² ΠΎΠ΄Π½ΠΎΠΌ отсСкС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒΡΡ пластик, Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ β€” стСкло:

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ type inference ΠΈ diamond operator ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² ΠΏΡ€Π°Π²ΠΎΠΉ части.

ОбъявляСм ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-интСрфСйсы

ОбъявлСниС Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ- интСрфСйсов ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° объявлСниС Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-классов. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ Ρ‚Π΅ΠΌΡƒ ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ создадим интСрфСйс ΠΏΡƒΠ½ΠΊΡ‚Π° ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ GarbageHandler сразу с двумя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ: Ρ‚ΠΈΠΏ мусора ΠΈ способ ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ:

Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ (ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ‚ΡŒ) этот интСрфСйс ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ, Π½Π΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ- классС:

Но ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΉΡ‚ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡƒΡ‚Ρ‘ΠΌ ΠΈ сначала ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-класс с двумя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ:

Или ΡΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти Π΄Π²Π° способа ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-класс Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ:

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-классы ΠΈ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-интСрфСйсы вмСстС Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ‚ΠΈΠΏΠ°ΠΌΠΈ.

МоТно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляры Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ‚ΠΈΠΏΠΎΠ² Β«Π±Π΅Π· Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈΒ», Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ Π²Π°ΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° Box β€” просто Box:

Для Ρ‚Π°ΠΊΠΎΠ³ΠΎ случая Π΄Π°ΠΆΠ΅ Π΅ΡΡ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ β€” raw type, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ «сырой Ρ‚ΠΈΠΏΒ». Π­Ρ‚Ρƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ оставили Π² языкС для совмСстимости со старым ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» написан Π΄ΠΎ появлСния Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ².

Π’ Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Ρ‚Π°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅ рСкомСндуСтся. Π”Π° ΠΈ Π·Π°Ρ‡Π΅ΠΌ? Π’Π΅Π΄ΡŒ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ способС Ρ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ всС прСимущСства использования Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ².

ПишСм Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π²Ρ‹ΡˆΠ΅ ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-классах ΠΈ интСрфСйсах. Π’ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‚Π°ΠΊ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ.

Π”ΠΎ этого ΠΌΡ‹ использовали Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ обозначСния Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-класса ΠΈΠ»ΠΈ интСрфСйса, Π½ΠΎ это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ нашСго ΠΏΡƒΠ½ΠΊΡ‚Π° ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ опция: сбор опасных ΠΎΡ‚Ρ…ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сотрудники вывозят Π½Π° ΡƒΡ‚ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ мСсто. НапишСм ΠΌΠ΅Ρ‚ΠΎΠ΄ для этого:

Π£ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° transfer Π΅ΡΡ‚ΡŒ свой Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ для Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ обязан ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ Π½ΠΈ с Ρ‚ΠΈΠΏΠΎΠΌ T, Π½ΠΈ с Ρ‚ΠΈΠΏΠΎΠΌ S. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠΈ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΊΠ°ΠΊ ΠΈ Π² случаС с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ класса ΠΈΠ»ΠΈ интСрфСйса, ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобках.

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ΠΈ Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… (Π½Π΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ) классах ΠΈ интСрфСйсах. Наш класс для ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠΎΠ³ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π—Π΄Π΅ΡΡŒ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° синтаксис: ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ послС ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° доступа ( public), Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ( void). Они ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΏΡΡ‚ΡƒΡŽ Π² ΠΎΠ±Ρ‰ΠΈΡ… ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобках.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ свСрху ΠΈ снизу

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠΌ нашС прСдставлСниС ΠΎ мусорС ΠΈ Π²Π²Π΅Π΄Ρ‘ΠΌ для Π½Π΅Π³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ свойство β€” массу Β«Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠ³ΠΎ прСдставитСля», Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ массу ΠΎΠ΄Π½ΠΎΠΉ пластиковой Π±ΡƒΡ‚Ρ‹Π»ΠΊΠΈ ΠΈΠ»ΠΈ листка Π±ΡƒΠΌΠ°Π³ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту массу Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΠΎΠ³ΠΎ класса Box:

И ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΡ€ΠΈ компиляции: ΠΌΡ‹ Π½Π΅ рассказали компилятору, Ρ‡Ρ‚ΠΎ T β€” это ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π²ΠΈΠ΄ мусора. Π˜ΡΠΏΡ€Π°Π²ΠΈΠΌ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ upper bounding β€” ограничСния свСрху:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ getItemWeight ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ скомпилируСтся.

Π—Π΄Π΅ΡΡŒ T extends Garbage ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² качСствС T ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Garbage ΠΈΠ»ΠΈ любой класс-наслСдник Garbage. Из ΡƒΠΆΠ΅ извСстных Π½Π°ΠΌ классов это ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Paper ΠΈΠ»ΠΈ Plastic. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΈ Ρƒ Garbage, ΠΈ Ρƒ всСх Π΅Π³ΠΎ наслСдников Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ getWeight, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² Π½ΠΎΠ²ΠΎΠΉ вСрсии Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-класса Box.

Для ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса ΠΈΠ»ΠΈ интСрфСйса ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ сразу нСсколько ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ. Вспомним ΠΏΡ€ΠΎ интСрфСйс для ΠΏΡƒΠ½ΠΊΡ‚Π° ΠΏΡ€ΠΈΡ‘ΠΌΠ° мусора ΠΈ Π²Π²Π΅Π΄Ρ‘ΠΌ класс для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ β€” HandleMethod. Π’ΠΎΠ³Π΄Π° GarbageHandler ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Wildcards

Π’Π΅Ρ€ΠΌΠΈΠ½ wildcard ΠΏΡ€ΠΈΡˆΡ‘Π» Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹. Π’ ΠΏΠΎΠΊΠ΅Ρ€Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΊΠ°Ρ€Ρ‚Ρƒ, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ вмСсто любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π”ΠΆΠΎΠΊΠ΅Ρ€ β€” извСстный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠΉ Β«Π΄ΠΈΠΊΠΎΠΉ ΠΊΠ°Ρ€Ρ‚Ρ‹Β».

Wildcard нСльзя ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ Π΄ΠΎ этого ΠΌΡ‹ писали Π±ΡƒΠΊΠ²Π΅Π½Π½Ρ‹Π΅ обозначСния. НС получится, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ класс Box ΠΈΠ»ΠΈ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ:

Wildcards ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для объявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² совмСстно с классами ΠΈΠ· Java Collection Framework β€” здСсь собраны инструмСнты Java для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с коллСкциями. Если Π²Ρ‹ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Π½ΠΈΠΌΠΈ, освСТитС знания, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π² эту ΡΡ‚Π°Ρ‚ΡŒΡŽ.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ вмСсто Β«?Β» любой Ρ‚ΠΈΠΏ, Π² Ρ‚ΠΎΠΌ числС Paper, поэтому строка ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ скомпилируСтся:

Wildcards ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ²:

Π­Ρ‚ΠΎ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΠΎΠ΅ Π½Π°ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ свСрху, upper bounding, β€” вмСсто Β«?Β» допуст ΠΈΠΌ Garbage ΠΈΠ»ΠΈ любой Π΅Π³ΠΎ класс-наслСдник, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Paper ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚.

Но ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΈ снизу. Π­Ρ‚ΠΎ называСтся lower bounding ΠΈ выглядит Ρ‚Π°ΠΊ:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ понятия, связанныС с Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ°ΠΌΠΈ

ΠœΡ‹ Π½Π΅ успСли Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Π±ΠΎΠ»Π΅Π΅ слоТными Π²Π΅Ρ‰Π°ΠΌΠΈ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с Π·Π°ΠΌΠ΅Π½Π°ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ‚ΠΈΠΏΠΎΠ² Π² классах-наслСдниках, с ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π½Π΅ ΡƒΠ·Π½Π°Π»ΠΈ ΠΎΠ± особСнностях ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ с wildcards.

Обо всём этом ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ β€” Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡΡ‚Π°Ρ‚ΡŒΡΡ…. А ΠΏΠΎΠΊΠ° собСрём нСбольшой словарик ΠΈΠ· Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ связаны с использованиСм Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ², β€” ΠΎΠ½ΠΈ пригодятся ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹:

Π’Π΅Ρ€ΠΌΠΈΠ½Π Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ°
Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ‚ΠΈΠΏΡ‹ (generic types)Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-класс ΠΈΠ»ΠΈ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-интСрфСйс с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ»ΠΈ нСсколькими ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅
ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ (parameterized types)Π’Ρ‹Π·ΠΎΠ² Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ‚ΠΈΠΏΠ°. Для Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ‚ΠΈΠΏΠ° List ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, List
ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° (type parameter)Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ объявлСнии Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ‚ΠΈΠΏΠΎΠ². Для Box T β€” это ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ°
АргумСнт Ρ‚ΠΈΠΏΠ° (type argument)Π’ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ вмСсто ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ°. НапримСр, для Box

Paper β€” это Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ°

WildcardΠžΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ΡΡ символом Β«?Β» β€” нСизвСстный Ρ‚ΠΈΠΏ
ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ wildcard (bounded wildcard)Wildcard, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ свСрху β€” ΠΈΠ»ΠΈ снизу β€”
Π‘Ρ‹Ρ€ΠΎΠΉ Ρ‚ΠΈΠΏ (raw type)Имя Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ‚ΠΈΠΏΠ° Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ°. Для List сырой Ρ‚ΠΈΠΏ β€” это List

Π•Ρ‰Ρ‘ большС ΠΎ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ°Ρ…, коллСкциях ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… элСмСнтах языка Java ΡƒΠ·Π½Π°ΠΉΡ‚Π΅ Π½Π° нашСм курсС Β«ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΡ Java-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΒ». Научим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° самом вострСбованном языкС ΠΈ ΠΏΠΎΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒΡΡ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ссылочного Ρ‚ΠΈΠΏΠ° хранят адрСс ячСйки Π² памяти, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π»Π΅ΠΆΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.
Π’ этом ΠΈΡ… ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΠ³Π΄Π° Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ хранится само Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
ВсС ссылочныС Ρ‚ΠΈΠΏΡ‹ Π² Java Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° Object.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠŸΡ€ΠΈΡˆΠ΅Π», ΡƒΠ²ΠΈΠ΄Π΅Π», ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΠ»: погруТаСмся Π² Java Generics

Java Generics β€” это ΠΎΠ΄Π½ΠΎ ΠΈΠ· самых Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π·Π° всю ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ языка Java. Β«Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈΒ», доступныС с Java 5, сдСлали использованиС Java Collection Framework ΠΏΡ€ΠΎΡ‰Π΅, ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΈ бСзопаснСС. Ошибки, связанныС с Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ использованиСм Ρ‚ΠΈΠΏΠΎΠ², Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° этапС компиляции. Π”Π° ΠΈ сам язык Java стал Π΅Ρ‰Π΅ бСзопаснСС. НСсмотря Π½Π° ΠΊΠ°ΠΆΡƒΡ‰ΡƒΡŽΡΡ простоту ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с трудностями ΠΏΡ€ΠΈ ΠΈΡ… использовании. Π’ этом постС я расскаТу ΠΎΠ± особСнностях Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Java Generics, Ρ‡Ρ‚ΠΎΠ±Ρ‹ этих трудностСй Ρƒ вас Π±Ρ‹Π»ΠΎ помСньшС. ΠŸΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡΡ, Ссли Π²Ρ‹ Π½Π΅ Π³ΡƒΡ€Ρƒ Π² Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ°Ρ…, ΠΈ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ трудностСй ΠΏΡ€ΠΈ ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Π² Ρ‚Π΅ΠΌΡƒ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java

Π Π°Π±ΠΎΡ‚Π° с коллСкциями

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π±Π°Π½ΠΊΡƒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ сумму сбСрСТСний Π½Π° счСтах ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². Π”ΠΎ появлСния Β«Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ²Β» ΠΌΠ΅Ρ‚ΠΎΠ΄ вычислСния суммы выглядСл Ρ‚Π°ΠΊ:

Π‘ появлСниСм Generics Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠ° ΠΎΡ‚ΠΏΠ°Π»Π°:

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ строчкС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠΆΠ΅ ΠΎΡ‚ΠΏΠ°Π΄Π°Π»Π°. Если потрСбуСтся, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² ( casting ) Π±ΡƒΠ΄Π΅Ρ‚ сдСлано Π½Π° этапС компиляции.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки

Π’ΠΈΠΏΠŸΠΎΠ΄Ρ‚ΠΈΠΏ
NumberInteger
ListArrayList
CollectionList
IterableCollection

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ Ρ‚ΠΈΠΏ/ΠΏΠΎΠ΄Ρ‚ΠΈΠΏ

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° подстановки Π² Java:

ΠšΠΎΠ²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΠ½Ρ‚Ρ€Π°Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ

Но Ссли ΠΌΡ‹ попытаСмся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ содСрТимоС массива Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ arr ΠΈ запишСм Ρ‚ΡƒΠ΄Π° число 42, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ArrayStoreException Π½Π° этапС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ 42 являСтся Π½Π΅ строкой, Π° числом. Π’ этом нСдостаток ковариантности массивов Java: ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° этапС компиляции, ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒΡΡ ΡƒΠΆΠ΅ Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅.

Β«Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈΒ» ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½Ρ‹. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Wildcards

ВсСгда Π»ΠΈ Generics ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹? НСт. ΠŸΡ€ΠΈΠ²Π΅Π΄Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

Π­Ρ‚ΠΎ ΠΊΠΎΠ²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ. List β€” ΠΏΠΎΠ΄Ρ‚ΠΈΠΏ List

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic javaextends B β€” символ подстановки с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹
super B β€” символ подстановки с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π½ΠΈΠΆΠ½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹
Π³Π΄Π΅ B β€” прСдставляСт собой Π³Ρ€Π°Π½ΠΈΡ†Ρƒ

2. ΠŸΠΎΡ‡Π΅ΠΌΡƒ нСльзя ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ элСмСнт ΠΈΠ· списка Π½ΠΈΠΆΠ΅?

The Get and Put Principle ΠΈΠ»ΠΈ PECS (Producer Extends Consumer Super)

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ wildcard с Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ ΠΈ Π½ΠΈΠΆΠ½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ Π΄Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΠΈΡ‡ΠΈ, связанныС с бСзопасным использованиСм Ρ‚ΠΈΠΏΠΎΠ². Из ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ (ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ null для extends ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Object для super ). Π§Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ Π»Π΅Π³Ρ‡Π΅ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΊΠΎΠΉ wildcard ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, сущСствуСт ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ PECS β€” Producer Extends Consumer Super.

ΠΈ Raw Ρ‚ΠΈΠΏΡ‹

Если ΠΌΡ‹ опустим ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ здСсь:

Если ΠΌΡ‹ попытаСмся Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρƒ Raw Ρ‚ΠΈΠΏΠ°, Ρ‚ΠΎ компилятор выдаст Π½Π°ΠΌ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Β«Unchecked callΒ». Если ΠΌΡ‹ попытаСмся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ присваиваниС ссылки Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Raw Ρ‚ΠΈΠΏΡƒ, Ρ‚ΠΎ компилятор выдаст ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Β«Unchecked assignmentΒ». Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ этих ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΠΏΠΎΠ·ΠΆΠ΅, ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ошибкам Π²ΠΎ врСмя выполнСния нашСго прилоТСния.

Wildcard Capture

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ пСрСстановку элСмСнтов списка Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС.

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎ Wildcard Capture ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ здСсь ΠΈ здСсь.

Π’Ρ‹Π²ΠΎΠ΄

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ°

Π’ΠΎΡ‚ Π΅Ρ‰Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· класса Enum:

Multiple bounds (мноТСствСнныС ограничСния)

Π’Ρ‹Π²ΠΎΠ΄

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ свСрху ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ»ΠΈ нСсколькими Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. Π’ случаС мноТСствСнного ограничСния лСвая Π³Ρ€Π°Π½ΠΈΡ†Π° (ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² процСссС затирания (Type Erasure).

Type Erasure

На ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅ Π½ΠΈΠΆΠ΅ Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:
Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ generic java

Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ слСва происходит compile-time error, Π° справа всС компилируСтся Π±Π΅Π· ошибок. ΠŸΠΎΡ‡Π΅ΠΌΡƒ?

Reifiable Ρ‚ΠΈΠΏΡ‹

ΠŸΠΎΡ‡Π΅ΠΌΡƒ информация ΠΎΠ± ΠΎΠ΄Π½ΠΈΡ… Ρ‚ΠΈΠΏΠ°Ρ… доступна, Π° ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π½Π΅Ρ‚? Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠ·-Π·Π° процСсса затирания Ρ‚ΠΈΠΏΠΎΠ² компилятором информация ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚ΠΈΠΏΠ°Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ потСряна. Если ΠΎΠ½Π° ΠΏΠΎΡ‚Π΅Ρ€ΡΠ»Π°ΡΡŒ, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΆΠ΅ Π½Π΅ reifiable. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ½Π° Π²ΠΎ врСмя выполнСния нСдоступна. Если доступна – соотвСтствСнно, reifiable.

РСшСниС Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ всС ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ доступными Π²ΠΎ врСмя выполнСния β€” это ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π² систСмС Ρ‚ΠΈΠΏΠΎΠ² Java. Π’Π°ΠΊ сдСлали, Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, для совмСстимости с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Π—Π° ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ β€” полная Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ систСмы ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΎ врСмя выполнСния Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°.

И Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° Π·Π°Π΄Π°Ρ‡ΠΊΠ°. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ нСльзя ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Exception?

КаТдоС catch Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² try-catch провСряСт Ρ‚ΠΈΠΏ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ‡Ρ‚ΠΎ Ρ€Π°Π²Π½ΠΎΡΠΈΠ»ΡŒΠ½ΠΎ instanceof), соотвСтствСнно, Ρ‚ΠΈΠΏ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Reifiable. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Throwable ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΡ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹.

Unchecked Warnings

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ нашСго прилоТСния ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Unchecked Warning β€” ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ компилятор Π½Π΅ смог ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ бСзопасности использования Π½Π°ΡˆΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ². Π­Ρ‚ΠΎ Π½Π΅ ошибка, Π° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ. Но ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ всС-Ρ‚Π°ΠΊ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

Heap Pollution

Как ΠΌΡ‹ упомянули Ρ€Π°Π½Π΅Π΅, присваиваниС ссылки Π½Π° Raw Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΡŽ Β«Unchecked assignmentΒ». Если ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π³ΠΎ, Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ситуация ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ » Heap Pollution » (загрязнСниС ΠΊΡƒΡ‡ΠΈ). Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π’ строкС (1) компилятор ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΎΠ± Β«Unchecked assignmentΒ».

Рассмотрим Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Java Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ присваиваниС Π² строкС (1). Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для обСспСчСния ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости. Но Ссли ΠΌΡ‹ попытаСмся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ add Π² строкС (2), Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Unchecked call β€” компилятор ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ нас ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ ошибкС. Π’ самом Π΄Π΅Π»Π΅, ΠΌΡ‹ ΠΆΠ΅ пытаСмся Π² список строк Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ†Π΅Π»ΠΎΠ΅ число.

Reflection

Π₯отя ΠΏΡ€ΠΈ компиляции ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ стирания (type erasure), ΠΊΠΎΠ΅-ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Reflection.

Π‘ появлСниСм Generics класс java.lang.Class стал ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ. Рассмотрим Π²ΠΎΡ‚ этот ΠΊΠΎΠ΄:

Π’Ρ‹Π²ΠΎΠ΄

Если информация ΠΎ Ρ‚ΠΈΠΏΠ΅ доступна Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ называСтся Reifiable. К Reifiable Ρ‚ΠΈΠΏΠ°ΠΌ относятся: ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, Π½Π΅ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ с Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ символом подстановки, Raw Ρ‚ΠΈΠΏΡ‹ ΠΈ массивы, элСмСнты ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ reifiable.

Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Unchecked Warnings ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Β«Π·Π°Π³Ρ€ΡΠ·Π½Π΅Π½ΠΈΡŽ ΠΊΡƒΡ‡ΠΈΒ» ΠΈ ошибкам Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Reflection Π½Π΅ позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ссли ΠΎΠ½ Π½Π΅ Reifiable. Но Reflection позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ значСния, ΠΎ Ρ‚ΠΈΠΏΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈ ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΏΠΎΠ»Π΅ΠΉ класса.

Type Inference

Π’Π΅Ρ€ΠΌΠΈΠ½ ΠΌΠΎΠΆΠ½ΠΎ пСрСвСсти ΠΊΠ°ΠΊ Β«Π’Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠ°Β». Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ компилятора ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ (Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ) Ρ‚ΠΈΠΏ ΠΈΠ· контСкста. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°:

Π‘ появлСниСм Π΄Π°ΠΉΠΌΠΎΠ½Π΄-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π² Java 7 ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Ρƒ ArrayList :

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Ρƒ нас Π΅ΡΡ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт связный список:

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° List.nil() ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π²Π΅Π΄Π΅Π½ ΠΈΠ· ΠΏΡ€Π°Π²ΠΎΠΉ части:

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π²Ρ‹Π±ΠΎΡ€Π° Ρ‚ΠΈΠΏΠ° компилятором ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ° для Π²Ρ‹Π·ΠΎΠ²Π° List.nil() Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ String β€” это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² JDK 7, всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ.

Выглядит Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ, Ρ‡Ρ‚ΠΎ компилятор Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ вывСсти Ρ‚ΠΈΠΏ, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° пСрСдаСтся Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π’ JDK 7 ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π±Ρ‹ compile-time error. А Π² JDK 8 скомпилируСтся. Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ пСрвая Ρ‡Π°ΡΡ‚ΡŒ JEP-101, Π΅Π³ΠΎ пСрвая Ρ†Π΅Π»ΡŒ β€” Π²Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠ° Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. ЕдинствСнная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ это Π² вСрсиях Π΄ΠΎ JDK 8 β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ явный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

Вторая Ρ‡Π°ΡΡ‚ΡŒ JEP-101 Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Π±Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Но данная Π·Π°Π΄Π°Ρ‡Π° Π½Π΅ Ρ€Π΅ΡˆΠ΅Π½Π° Π΄ΠΎ сих ΠΏΠΎΡ€, ΠΈ вряд Π»ΠΈ Π² блиТайшСС врСмя появится такая функция. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… вСрсиях JDK Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² этом исчСзнСт, Π½ΠΎ ΠΏΠΎΠΊΠ° Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ:

ПослС Π²Ρ‹Ρ…ΠΎΠ΄Π° JEP 101 Π½Π° StackOverflow появилось мноТСство вопросов ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹ ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполнялся Π½Π° 7-ΠΉ вСрсии, Π½Π° 8-ΠΉ выполняСтся ΠΈΠ½Π°Ρ‡Π΅ – ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ компилируСтся? Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ послС компиляции Π½Π° JDK1.8:

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ послС компиляции Π½Π° JDK1.7 – Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π° Java 7:

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Oracle выпустил руководство ΠΏΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρƒ с JDK1.7 Π½Π° JDK 1.8 Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ описаны ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ Π½Π° Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Java, ΠΈ Ρ‚ΠΎ, ΠΊΠ°ΠΊ эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ.

НапримСр Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΊΠΎΠ΄Π΅ Π²Ρ‹ΡˆΠ΅ послС компиляции Π½Π° Java 8 всС Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π½Π° Java 7, сдСлайтС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ:

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

На этом ΠΌΠΎΠΉ рассказ ΠΎ Java Generics ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ. Π’ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ источники, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π²Π°ΠΌ Π² освоСнии Ρ‚Π΅ΠΌΡ‹:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *