Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java

ИспользованиС generic wildcards для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ удобства Java API

Π”ΠΎΠ±Ρ€ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ суток!

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ API

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ вас Π΅ΡΡ‚ΡŒ интСрфСйс Π½Π΅ΠΊΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ, допустим, двумя Ρ‚ΠΈΠΏΠ°ΠΌΠΈ: Ρ‚ΠΈΠΏ ΠΊΠ»ΡŽΡ‡Π° ( K ) ΠΈ Ρ‚ΠΈΠΏ значСния ( V ). Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ опрСдСляСт Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅:

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ выглядит Π²ΠΏΠΎΠ»Π½Π΅ Π°Π΄Π΅ΠΊΠ²Π°Ρ‚Π½ΠΎ ΠΈ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ простой ΠΊΠΎΠ΄ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ:

Однако, Π² Ρ‡ΡƒΡ‚ΡŒ ΠΌΠ΅Π½Π΅Π΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… случаях ΠΊΠ»ΠΈΠ΅Π½Ρ‚ вашСго API столкнётся с нСприятными ограничСниями.

Π’ΠΎΠ·ΡŒΠΌΡ‘ΠΌ послСдний ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ значСния, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρƒ. Π§Ρ‚ΠΎ с Π½ΠΈΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Ρ‚Π°ΠΊ? Π‘Π΅Ρ€Ρ‘ΠΌ, Π΄Π° ΠΈ пишСм:

А вСдь всё Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Ρ‚Π°ΠΊ просто! Нам Π½ΡƒΠΆΠ½ΠΎ лишь слСгка ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ сигнатуру ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

Π—Π°ΠΏΠΈΡΡŒ Predicate ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ ΠΎΡ‚ V ΠΈΠ»ΠΈ любого супСртипа V (Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ Object)Β». Π”Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π»ΠΎΠΌΠ°Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°, Π·Π°Ρ‚ΠΎ устраняСт Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ бСссмыслСнныС ограничСния Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°. ΠšΠ»ΠΈΠ΅Π½Ρ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свой ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ для Vehicle ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ свободно:

ΠœΡ‹ ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΠΌ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΡ‘ΠΌ Ρ‡ΡƒΡ‚ΡŒ Π½ΠΈΠΆΠ΅, ΠΈ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ совсСм просто.

Π—Π°ΠΏΠΈΡΡŒ Map Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«ΠΌΠ°ΠΏΠΊΠ° с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° K ΠΈΠ»ΠΈ любого ΠΈΠ· ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΠ² K ΠΈ со значСниями Ρ‚ΠΈΠΏΠ° V ΠΈΠ»ΠΈ любого ΠΈΠ· ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΠ² VΒ».

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ PECS β€” Producer Extends Consumer Super

Настало врСмя вывСсти ΠΎΠ±Ρ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, благодаря ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΡ‹ всСгда Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ интСрфСйсы, Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ бСзопасныС с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ‚ΠΈΠΏΠΎΠ², Π½ΠΎ ΠΏΡ€ΠΈ этом Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ бСссмыслСнных ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΡ… нСудобства ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ.

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Joshua Bloch Π½Π°Π·Ρ‹Π²Π°Π΅Ρ‚ PECS (Producer Extends Consumer Super), Π° Π°Π²Ρ‚ΠΎΡ€Ρ‹ ΠΊΠ½ΠΈΠ³ΠΈ Java Generics and Collections (Maurice Naftalin, Philip Wadler) β€” Get and Put Principle. Но Π΄Π°Π²Π°ΠΉΡ‚Π΅ остановимся Π½Π° PECS, Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ‰Π΅. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ гласит:

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ, ΠΊΡ‚ΠΎ это Ρ‚Π°ΠΊΠΈΠ΅? ΠžΡ‡Π΅Π½ΡŒ просто: Ссли ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Ρ‚ΠΎ этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ β€” ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ, Π° Ссли ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ являСтся ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΌ. Π’Π°ΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ опрСдСляя производитСля ΠΈΠ»ΠΈ потрСбитСля, ΠΌΡ‹ рассматриваСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° T.

Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Predicate β€” это ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ (ΠΌΠ΅Ρ‚ΠΎΠ΄ getAll(Predicate ) ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ Π² этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° T), Π° Map β€” ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ (ΠΌΠ΅Ρ‚ΠΎΠ΄ putAll(Map ) Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° T β€” Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠΎΠ΄ T подразумСваСтся K ΠΈ V β€” ΠΈΠ· этого Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°).

Π’ случаС, Ссли Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ являСтся ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΌ, ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΈΠ· ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, ΠΈ ΠΏΠΈΡˆΠ΅Ρ‚ Π² Π½Π΅Ρ‘ (ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΡΡ‚ΠΈΠ»ΡŒ, Π½ΠΎ всякоС Π±Ρ‹Π²Π°Π΅Ρ‚) β€” Ρ‚ΠΎΠ³Π΄Π° Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ.

Π‘ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌΠΈ значСниями Ρ‚ΠΎΠΆΠ΅ Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ β€” Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ удобства использованиС wildcard-ΠΎΠ² Π² этом случаС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ принСсёт, Π° лишь Π²Ρ‹Π½ΡƒΠ΄ΠΈΡ‚ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ wildcard-Ρ‹ Π² собствСнном ΠΊΠΎΠ΄Π΅.

Π’ΠΎΠΎΡ€ΡƒΠΆΠΈΠ²ΡˆΠΈΡΡŒ PECS-ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΏΠΎ всСм ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ нашСго MyObjectStore интСрфСйса ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Ρ‚Π°ΠΌ, Π³Π΄Π΅ это трСбуСтся. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ put(K, V) ΠΈ get(K) ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ (Ρ‚.ΠΊ. ΠΎΠ½ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ); ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ putAll(Map ) ΠΈ getAll(Predicate ) ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΈ Ρ‚Π°ΠΊ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΠ»ΠΈ, дальшС Π½Π΅ΠΊΡƒΠ΄Π°; Π° Π²ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ getAll(Collection ) ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚-ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ. ВмСсто

ΠΈ радуСмся Π½ΠΎΠ²ΠΎΠΌΡƒ, Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌΡƒ API! (Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΡ‹ Π½Π΅ Ρ‚Ρ€ΠΎΠ³Π°Π΅ΠΌ!)

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ потрСбитСля ΠΈ производитСля

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ. Π‘Π°ΠΌΡ‹ΠΉ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ производитСля β€” это Ρ„Π°Π±Ρ€ΠΈΠΊΠ°:

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ, ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°:

ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΌ Π² случаС, Ссли это ouput-коллСкция, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ складываСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ (хотя Ρ‚Π°ΠΊΠΎΠΉ ΡΡ‚ΠΈΠ»ΡŒ Π² Java Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ считаСтся ΠΏΠ»ΠΎΡ…ΠΈΠΌ Ρ‚ΠΎΠ½ΠΎΠΌ).

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

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ познакомились с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠΌ PECS (Producer Extends Consumer Super) ΠΈ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ API Π½Π° Java. Как ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, Π΄Π°ΠΆΠ΅ Π² самых ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Ρ… программистских ΠΊΠΎΠ½Ρ‚ΠΎΡ€Π°Ρ… ΠΎΠ± этом ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π΅ Π·Π½Π°ΡŽΡ‚, ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΡŽΡ‚ Π½Π΅ совсСм ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ API. Но, ΠΊ ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, ΠΈΡΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ошибки ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ, Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΠ² ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊΡƒ PECS ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹, Π²Ρ‹ ΡƒΠΆΠ΅ просто Π½Π΅ смоТСтС Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΅ΠΉ Π² дальнСйшСм.

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

Автор: Π‘Ρ€Π°ΠΉΠ΅Π½ Π“Π΅Ρ‚Ρ† (brian.goetz@sun.com)
Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€, Sun Microsystems
ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄: М. ΠžΡ€Π΅Π»ΡŒΡΠΊΠ°Ρ
Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: http://www.ibm.com/developerworks

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ: 28.04.2009

ПониманиС wildcard capture

Одним ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ слоТных аспСктов generic-Ρ‚ΠΈΠΏΠΎΠ² (ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²) Π² языкС Java ΡΠ²Π»ΡΡŽΡ‚ΡΡ wildcards (подстановочныС символы, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС – Β«?Β»), ΠΈ особСнно – Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Ρ€Π°Π·Π±ΠΎΡ€ Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹Ρ… сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, происходящих ΠΏΡ€ΠΈ wildcard capture (подстановкС вычисляСмого компилятором Ρ‚ΠΈΠΏΠ° вмСсто wildcard). Π’ Π΄Π°Π½Π½ΠΎΠΉ части «ВСория ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° JavaΒ» (Java theory and practice) ΡΡ‚Π°Ρ€Π΅ΠΉΡˆΠΈΠΉ Java-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π‘Ρ€Π°ΠΉΠ΅Π½ Π“Π΅Ρ‚Ρ† Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π·Π°Π³Π°Π΄ΠΎΡ‡Π½ΠΎ выглядящих сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, Π²Ρ‹Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… компилятором Β«javacΒ», ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΎΠ±Ρ…ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ использованиС generic-Ρ‚ΠΈΠΏΠΎΠ².

Дискуссия ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ generic-Ρ‚ΠΈΠΏΠΎΠ² Π½Π΅ прСкращаСтся с Ρ‚Π΅Ρ… самых ΠΏΠΎΡ€, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² язык Java Π² JDK 5. Одни ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ эти Ρ‚ΠΈΠΏΡ‹ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π° счСт Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ систСмы Ρ‚ΠΈΠΏΠΎΠ² ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‚ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ компилятора ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ². Π”Ρ€ΡƒΠ³ΠΈΠ΅ говорят, Ρ‡Ρ‚ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ generic-Ρ‚ΠΈΠΏΠΎΠ² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρƒ. ВсС ΠΌΡ‹ ΠΏΡ€ΠΈ ΠΈΡ… использовании ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌΠΈ Π·Π°Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ, Π½ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ wildcards ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΡΠ°ΠΌΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ generic-Ρ‚ΠΈΠΏΠΎΠ².

ΠžΡΠ½ΠΎΠ²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с wildcards

Generic-ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ срСдством выраТСния ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ повСдСния классов ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для исходно нСизвСстных Ρ‚ΠΈΠΏΠΎΠ². НапримСр: Β«ΠΊΠ°ΠΊΠΎΠΉ Π±Ρ‹ ΠΈΠ· Ρ‚ΠΈΠΏΠΎΠ² Π½ΠΈ использовался Π² этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² x ΠΈΠ»ΠΈ y, эти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°Β», Β«Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° для ΠΎΠ±ΠΎΠΈΡ… этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²Β», ΠΈΠ»ΠΈ Β«Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ foo() ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΏ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ bar()Β».

Wildcards – ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π²ΠΎΠΏΡ€ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π·Π½Π°ΠΊΠΈ, ΠΎΡ‚ΠΌΠ΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ мСсто, Π³Π΄Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ°. Они ΡΠ²Π»ΡΡŽΡ‚ΡΡ срСдством выраТСния ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π² условиях нСизвСстности ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ‚ΠΈΠΏΠ°. ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ эти Π·Π½Π°ΠΊΠΈ Π½Π΅ являлись Ρ‡Π°ΡΡ‚ΡŒΡŽ структуры generic-ΠΎΠ², унаслСдованной ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Generic Java (GJ), Π° Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½Π° Π·Π° Ρ‚Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΏΡΡ‚ΡŒ Π»Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡˆΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ созданиСм JSR 14 ΠΈ Π΅Π³ΠΎ послСдним выпуском.

Wildcards ΠΈΠ³Ρ€Π°ΡŽΡ‚ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² систСмС Ρ‚ΠΈΠΏΠΎΠ². Они ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π·Π°Π΄Π°Ρ‚ΡŒ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ для сСмСйства Ρ‚ΠΈΠΏΠΎΠ², ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊΠΈΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ generic-классом. Для generic-класса ArrayList Ρ‚ΠΈΠΏ ArrayList являСтся супСр-Ρ‚ΠΈΠΏΠΎΠΌ ArrayList с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ любого Ρ‚ΠΈΠΏΠ° T (Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ (raw type) ArrayList ΠΈ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Ρ‚ΠΈΠΏ (root type) Object, Π½ΠΎ эти супСртипы ΠΌΠ΅Π½Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚ΠΈΠΏΠ°).

Π£ мСня появился wildcard. Π§Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ?

Листинг 1 содСрТит ΠΏΡ€ΠΈΠΌΠ΅Ρ€ простого Ρ‚ΠΈΠΏΠ°-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Box, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ put ΠΈ get. Box ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ T, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΌ Ρ‚ΠΈΠΏ содСрТимого ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. НапримСр, Box ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² сСбя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ элСмСнты Ρ‚ΠΈΠΏΠ° String.

Листинг 1. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ generic-Ρ‚ΠΈΠΏ Box

Одно ΠΈΠ· прСимущСств wildcards состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ generic-Ρ‚ΠΈΠΏΠΎΠ² Π±Π΅Π· знания ΠΈΡ… Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… Π³Ρ€Π°Π½ΠΈΡ†. Допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ пСрСмСнная Ρ‚ΠΈΠΏΠ° Box – такая, ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ box Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ unbox() Π² листингС 2. Π§Ρ‚ΠΎ ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ unbox(), обрабатывая ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ box?

Листинг 2. ΠœΠ΅Ρ‚ΠΎΠ΄ Unbox с wildcard-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ

Π§Ρ‚ΠΎ Π·Π½Π°Π΅Ρ‚ unbox() ΠΎ Ρ‚ΠΈΠΏΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° box.get()? Он Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ это Ρ‚ΠΈΠΏ T для ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ нСизвСстного T. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π»ΡƒΡ‡ΡˆΠ΅Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ – ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, согласно ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния ΠΎΡ‚ get() являСтся Π·Π°ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ нСизвСстного Ρ€Π°Π½Π΅Π΅ Ρ‚ΠΈΠΏΠ° T. Π’ случаС Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ wildcard этот Ρ‚ΠΈΠΏ прСдставлСн Ρ‚ΠΈΠΏΠΎΠΌ Object. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ box.get() Π² листингС 2 Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Object.

Wildcard capture

Листинг 3 содСрТит ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ…ΠΎΠΆ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС бСрСтся экзСмпляр generic-Ρ‚ΠΈΠΏΠ° Box, ΠΈΠ· Π½Π΅Π³ΠΎ получаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ производится ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² Ρ‚ΠΎΡ‚ ΠΆΠ΅ Box.

Листинг 3. ВзятоС ΠΈΠ· box Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ


Capture helpers

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ компилятор отбрасываСт здСсь ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, сущСствуСт способ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π΄Π°Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ. Для этого Π½ΡƒΠΆΠ½ΠΎ Π΄Π°Ρ‚ΡŒ нСизвСстному wildcard-Ρ‚ΠΈΠΏΡƒ имя. Π’ ЛистингС 4 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° рСализация rebox(), Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π°Ρ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ generic-ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ это ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚:

Листинг 4. ИспользованиС Ρ…Π΅Π»ΠΏΠ΅Ρ€Π°

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ reboxHelper() являСтся generic-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ. Generic-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ вводят Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² (ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Π΅ Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Π΅ скобки ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚ΠΈΠΏΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для формулирования ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΈ/ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Однако Π² случаС reboxHelper() generic-ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ задСйствуСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° для опрСдСлСния ограничСния Ρ‚ΠΈΠΏΠ°, Π° позволяСт компилятору – Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠ° – Π΄Π°Ρ‚ΡŒ имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Ρ‚ΠΈΠΏΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ box.

МоТно Π±Ρ‹Π»ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΈ rebox() ΠΊΠ°ΠΊ generic-ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠ°ΠΊ ΠΌΡ‹ объявили reboxHelper(), Π½ΠΎ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ API это Π½Π΅ считаСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ стилСм. Основной ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ здСсь – Π½Π΅ Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Ссли Π½Π° это имя Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ссылок. Π’ контСкстС generic-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° показываСтся Π² сигнатурС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Ρ‚ΠΎ ΠΎΠ½, скорСС, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ wildcard, Π½Π΅ΠΆΠ΅Π»ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ‚ΠΈΠΏΠ°. Π’ΠΎΠΎΠ±Ρ‰Π΅ ΠΆΠ΅, API с wildcards ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ API с generic-ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ; разрастаниС ΠΈΠΌΠ΅Π½ Ρ‚ΠΈΠΏΠΎΠ² Π² Π±ΠΎΠ»Π΅Π΅ слоТном объявлСнии ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это объявлСниС ΠΌΠ΅Π½Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всСгда сущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ нСобходимости Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ имя с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ private capture-Ρ…Π΅Π»ΠΏΠ΅Ρ€Π°, Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π΄Π°Π΅Ρ‚ способ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ API чистыми, Π½Π΅ удаляя ΠΏΡ€ΠΈ этом Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

Π’Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠ°

ΠŸΡ€ΠΈΠ΅ΠΌ с capture-Ρ…Π΅Π»ΠΏΠ΅Ρ€ΠΎΠΌ основан Π½Π° Π²Ρ‹Π²ΠΎΠ΄Π΅ Ρ‚ΠΈΠΏΠΎΠ² (type inference) ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡ€ΠΈ фиксации (capture conversion). Java-компилятор Π½Π΅ выполняСт Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… мСстах, ΠΎΠ΄Π½Π°ΠΊΠΎ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚ΠΈΠΏΠ° Π² generic-ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… ΠΎΠ½ это Π΄Π΅Π»Π°Π΅Ρ‚ (Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π½Π° Π²Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΠ², поэтому Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚ΠΈΠΏΠΎΠ² Π² Java). ΠŸΡ€ΠΈ нСобходимости ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ°, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли сущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ этот Ρ‚ΠΈΠΏ – Π° capture-Ρ‚ΠΈΠΏΡ‹ нСльзя ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ сработаСт лишь Π² Ρ‚ΠΎΠΌ случаС, Ссли компилятор Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΈΠΏ сам. ИмСнно ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ позволяСт компилятору ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π·Π°Π³Π»ΡƒΡˆΠΊΡƒ названия Ρ‚ΠΈΠΏΠ° для wildcard Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Ρ‚ΠΈΠΏΠΎΠ² Π±Ρ‹Π» Π²Ρ‹Π²Π΅Π΄Π΅Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ этот Ρ‚ΠΈΠΏ.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ вывСсти Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ подходящий Ρ‚ΠΈΠΏ для ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ²Π° generic-ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, для Ρ‚Π°ΠΊΠΎΠ³ΠΎ generic-ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

компилятор ΠΌΠΎΠ³ Π±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ T ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Integer, Number, Serializable ΠΈΠ»ΠΈ Object, Π½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Integer, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΠΌ ограничСниям.

Π’Π°ΠΊΠΎΠ΅ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ Β«ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° DRYΒ» (Don’t Repeat Yourself – «НС повторяйся!Β») ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Π΄Ρ€Π°ΠΆΠ°Ρ‚ΡŒ, Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° IDE Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ Π·Π° вас Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Однако Ссли рСализация класса BoxImpl ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ generic-ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ класса, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ЛистингС 5 (это, Π² любом случаС, Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ идСя), Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π² клиСнтском ΠΊΠΎΠ΄Π΅:

Листинг 5. Generic-ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ класса, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½Ρ‹Ρ… описаний Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… Ρ‚ΠΈΠΏΠ°.

Если Box создаСтся с использованиСм Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ BoxImpl.make(), ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° достаточно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ всСго ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·:

Помимо ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ количСства Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ Π½Π° клавиши, продСмонстрированная здСсь Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° использования Ρ„Π°Π±Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ прСимущСства ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с использованиСм конструкторов: Ρ„Π°Π±Ρ€ΠΈΠΊΠ°ΠΌ классов ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°, Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ классов способны Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΡ‹ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΈ ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ совмСстноС использованиС нСизмСняСмых экзСмпляров. (Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ прСимущСствах статичСских Ρ„Π°Π±Ρ€ΠΈΠΊ классов, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Β«Effective Java, Item #1Β», см. Ρ€Π°Π·Π΄Π΅Π» «РСсурсы»).

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

НСсомнСнно, wildcards ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ затруднСния. Одни ΠΈΠ· самых Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹Ρ… сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, Π²Ρ‹Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… компилятором Java, связаны ΠΊΠ°ΠΊ Ρ€Π°Π· с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ wildcards. НСкоторыС ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ слоТных Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² спСцификации языка Java Ρ‚Π°ΠΊΠΆΠ΅ посвящСны wildcards. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΏΡ€ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ использовании wildcards Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΡƒΠ΄ΠΎΠ±Π½Ρ‹. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ описано Π΄Π²Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ° – использованиС capture-Ρ…Π΅Π»ΠΏΠ΅Ρ€ΠΎΠ² ΠΈ generic-Ρ„Π°Π±Ρ€ΠΈΠΊ, прСимущСство ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² использовании generic-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚ΠΈΠΏΠΎΠ². ΠŸΡ€ΠΈ Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΎΠ½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ слоТностСй.

РСсурсы

Copyright Β© 1994-2016 ООО «Πš-ΠŸΡ€Π΅ΡΡ»

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

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ (Java, ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰Π°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ)

ΠŸΡ€Π΅Π΄ΠΈΡΠ»ΠΎΠ²ΠΈΠ΅

Π—Π° основу Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π±Ρ‹Π»Π° взята информация ΠΈΠ· 6-ΠΎΠΉ Π³Π»Π°Π²Ρ‹ ΠΊΠ½ΠΈΠ³ΠΈ Β«Oracle Certified Professional Java SE 7 Programmers Exams 1Z0-804 and 1Z0-805Β». Она Π±Ρ‹Π»Π° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° (ΠΊΠΎΠ΅-Π³Π΄Π΅ ΠΎΠ±Ρ€Π΅Π·Π°Π½Π°, Π° ΠΊΠΎΠ΅-Π³Π΄Π΅ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Google ΠΈ Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ). Π—Π΄Π΅ΡΡŒ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всС Π½ΡŽΠ°Π½ΡΡ‹ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² β€” для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. ΠŸΡ€ΠΈΡΡ‚Π½ΠΎΠ³ΠΎ прочтСния.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠžΠ±ΠΎΠ±Ρ‰Ρ‘Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” это Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ описанию Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π±Π΅Π· измСнСния ΠΈΡ… описания. Π’ Java, начиная с вСрсии J2SE 5.0, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ срСдства ΠΎΠ±ΠΎΠ±Ρ‰Ρ‘Π½Π½ΠΎΠ³ΠΎ программирования, синтаксичСски основанныС Π½Π° C++. НиТС Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ generics (Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ) ΠΈΠ»ΠΈ > β€” подмноТСство ΠΎΠ±ΠΎΠ±Ρ‰Ρ‘Π½Π½ΠΎΠ³ΠΎ программирования.

Допустим ΠΌΡ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅ΠΌ ΠΎ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ°Ρ… ΠΈ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ спСцифичСский Π²Ρ‹Π²ΠΎΠ΄ Π½Π° консоль ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° (с использованиСм Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок).

НиТС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

Π’ Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π±Ρ‹Π»Π° Π΄ΠΎΠΏΡƒΡ‰Π΅Π½Π° ошибка, ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π° консоли ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π° врСмя Π·Π°Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ± этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» с использованиСм Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² (ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ):

Π‘Π°ΠΌΠΎΠ΅ сущСствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ (для мСня) Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ошибкС, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π΅ скомпилируСтся:

Π”ΡƒΠΌΠ°ΡŽ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ согласятся, Ρ‡Ρ‚ΠΎ ошибка компиляции Β«Π»ΡƒΡ‡ΡˆΠ΅Β» ошибки Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, Ρ‚.ΠΊ. чисто тСорСтичСски скомпилированный ΠΊΠΎΠ΄ с ошибкой ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Ρ‚ΡƒΠ΄Π°, ΠΊΡƒΠ΄Π° Π΅ΠΌΡƒ Π»ΡƒΡ‡ΡˆΠ΅ Π±Ρ‹ ΠΈ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ΅ достоинство Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ². Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ рассмотрим конструкции, относящиСся ΠΊ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ°ΠΌ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ΄ скомпилировался, достаточно Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ строку

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ BoxPrinter:

ПослС ΠΈΠΌΠ΅Π½ΠΈ класса Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобках » » ΡƒΠΊΠ°Π·Π°Π½ΠΎ имя Ρ‚ΠΈΠΏΠ° «Π’», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ класса. ЀактичСски Π’ – это Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ ΠΏΠΎΠ·ΠΆΠ΅ (ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса).

Π’Π½ΡƒΡ‚Ρ€ΠΈ класса ΠΏΠ΅Ρ€Π²ΠΎΠ΅ использованиС T Π² объявлСнии поля:

Π—Π΄Π΅ΡΡŒ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ пСрСмСнная Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ‚ΠΈΠΏΠ° (generic type), Ρ‚.ΠΎ. Π΅Ρ‘ Ρ‚ΠΈΠΏ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½ ΠΏΠΎΠ·ΠΆΠ΅, ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса BoxPrinter.

Π’ main()-ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ происходит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ объявлСниС:

Π—Π΄Π΅ΡΡŒ указываСтся, Ρ‡Ρ‚ΠΎ Π’ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Integer. Π“Ρ€ΡƒΠ±ΠΎ говоря, для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° value1 всС поля Π’-Ρ‚ΠΈΠΏΠ° Π΅Π³ΠΎ класса BoxPrinter становятся полями Ρ‚ΠΈΠΏΠ° Integer (private Integer val;).
Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎ мСсто, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ T:

Как ΠΈ Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ val с Ρ‚ΠΈΠΏΠΎΠΌ Π’, Π²Ρ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ для конструктора BoxPrinter ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ T. ПозТС Π² main()-ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ конструктор Π² new, указываСтся, Ρ‡Ρ‚ΠΎ Π’ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Integer:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Π²Π½ΡƒΡ‚Ρ€ΠΈ конструктора BoxPrinter, arg ΠΈ val Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±Π° ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΈΠΏ T. НапримСр ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ конструктора:

ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ошибкС компиляции.

ПослСднСС мСсто использования Π’ Π² классС – ΠΌΠ΅Ρ‚ΠΎΠ΄ getValue():

Π’ΡƒΡ‚ Π²Ρ€ΠΎΠ΄Π΅ Ρ‚ΠΎΠΆΠ΅ всё ясно – этот ΠΌΠ΅Ρ‚ΠΎΠ΄ для ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π΄Π°Π½ ΠΏΡ€ΠΈ Π΅Π³ΠΎ (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°) создании.

ΠŸΡ€ΠΈ создании Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-классов ΠΌΡ‹ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ ΠΎΠ΄Π½ΠΈΠΌ лишь Ρ‚ΠΈΠΏΠΎΠΌ (Π’) – ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько:

НСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΈ Π½Π° количСство ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ:

Алмазный синтаксис (Diamond syntax)

ВСрнёмся Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°Π·Π°Π΄ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ со строкой ΠΊΠΎΠ΄Π°:

Если Ρ‚ΠΈΠΏΡ‹ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ:

Π’ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΡ€ΠΈ компиляции:

НСмного Π»Π΅Π½ΠΈΠ²ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈ этом ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡˆΠΈΠ±ΠΈΡ‚ΡŒΡΡ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Тизнь программистам Π² Java 7 Π±Ρ‹Π» Π²Π²Π΅Π΄Ρ‘Π½ Π°Π»ΠΌΠ°Π·Π½Ρ‹ΠΉ синтаксис (diamond syntax), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ°. Π’.Π΅. ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ компилятору ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’ΠΈΠ΄ ΡƒΠΏΡ€ΠΎΡ‰Ρ‘Π½Π½ΠΎΠ³ΠΎ объявлСния:

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ошибки связанныС с отсутствиСм «<>» ΠΏΡ€ΠΈ использовании Π°Π»ΠΌΠ°Π·Π½ΠΎΠ³ΠΎ синтаксиса

Π’ случаС с ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΊΠΎΠ΄Π° Π²Ρ‹ΡˆΠ΅ ΠΌΡ‹ просто ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΡ‚ компилятора, ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Pair являСтся Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ‚ΠΈΠΏΠΎΠΌ ΠΈ Π±Ρ‹Π»ΠΈ Π·Π°Π±Ρ‹Ρ‚Ρ‹ «<>» ΠΈΠ»ΠΈ явноС Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², компилятор рассматриваСт Π΅Π³ΠΎ Π² качСствС простого Ρ‚ΠΈΠΏΠ° (raw type) с Pair ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΌ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π₯отя Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² Π΄Π°Π½Π½ΠΎΠΌ сСгмСнтС ΠΊΠΎΠ΄Π°, это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ошибкС. Π—Π΄Π΅ΡΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ пояснСниС понятия простого Ρ‚ΠΈΠΏΠ°.

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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим Π½Π° Π²ΠΎΡ‚ этот:

По Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ выполнСния ΠΎΠ±Π° Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹, Π½ΠΎ Ρƒ Π½ΠΈΡ… разная идСя. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ мСсто с простым Ρ‚ΠΈΠΏΠΎΠΌ, Π²ΠΎ Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ – с Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠΌ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ сломаСм это Π΄Π΅Π»ΠΎ – Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π² ΠΎΠ±ΠΎΠΈΡ… случаях

Для простого Ρ‚ΠΈΠΏΠ° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния (java.lang.ClassCastException), Π° для Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ – ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, это ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° 2 самых ΠΏΠ΅Ρ€Π²Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Если Π² Π΄Π²ΡƒΡ… словах, Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании простых Ρ‚ΠΈΠΏΠΎΠ², Π²Ρ‹ тСряСтС прСимущСство бСзопасности Ρ‚ΠΈΠΏΠΎΠ², прСдоставляСмоС Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ°ΠΌΠΈ.

Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ (Generic methods)

По Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ классами (Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-классами), ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ (Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΎΠ±Ρ‰ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π΅ Π½Π°Π΄ΠΎ ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ Π² Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-классС. Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΡƒΠ΄ΠΎΠ±Π½Ρ‹, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠ°ΠΌ. (НапримСр, Π΅ΡΡ‚ΡŒ многочислСнныС ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² классС java.util.Collections.)

Рассмотрим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

Нам Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ интСрСсно это:

» » Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΎ послС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов «public» ΠΈ «static», Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, имя ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈ Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. Π’Π°ΠΊΠΎΠ΅ объявлСниС ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΎΡ‚ объявлСния ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Ρ… классов, Π³Π΄Π΅ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ указываСтся послС ΠΈΠΌΠ΅Π½ΠΈ класса. Π’Π΅Π»ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ – Π² Ρ†ΠΈΠΊΠ»Π΅ всС элСмСнты списка ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (val). Ну ΠΈ Π² main()-ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ происходит Π²Ρ‹Π·ΠΎΠ² нашСго ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ здСсь Π½Π΅ Π·Π°Π΄Π°Π½ явно Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Для IntList – это Integer ΠΈ 100 Ρ‚ΠΎΠΆΠ΅ упаковываСтся Π² Integer. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ставит Π² соотвСтствиС Ρ‚ΠΈΠΏΡƒ Π’ – Integer.

А сСйчас вопрос – какая (-ΠΈΠ΅) ΠΈΠ· Π½ΠΈΠΆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… строк откомпилируСтся Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ?

ΠžΡ‚Π²Π΅Ρ‚ с пояснСниСм:
ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ, Ρ‚.ΠΊ. нСльзя ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ интСрфСйса.
Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС ΠΌΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° ArrayList ΠΈ ссылку Π½Π° Π½Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ для ArrayList класса. И Ρ‚Π°ΠΌ, ΠΈ Ρ‚Π°ΠΌ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ‚ΠΈΠΏ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ – всё ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.
Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ΠΈ Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€Ρ‚ΠΎΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ошибка компиляции, Ρ‚.ΠΊ. Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ‚ΠΈΠΏΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ (связи наслСдования здСсь Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ).

УсловиС одинаковости Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ‚ΠΈΠΏΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅ совсСм Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ. Π’ частности Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΏΠΎΠ΄ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ 3. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΆΠ΅ это Π½Π΅ допускаСтся?

Π‘ΡƒΠ΄Π΅ΠΌ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎΡ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ – допустим 3-ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½. Рассмотрим Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:

Wildcards (Маски)

БСйчас Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Wildcard Parameters (wildcards). Π­Ρ‚ΠΎΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Π² Ρ€Π°Π·Π½Ρ‹Ρ… источниках пСрСводится ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ: ΠΌΠ΅Ρ‚Π°ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, подстановочныС символы, Π³Ρ€ΡƒΠΏΠΏΠΎΠ²Ρ‹Π΅ символы, ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, маски ΠΈ Ρ‚.Π΄. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ «ΠΌΠ°ΡΠΊΡƒ», просто ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΉ мСньшС букв…

Как Π±Ρ‹Π»ΠΎ написано Π²Ρ‹ΡˆΠ΅ Π²ΠΎΡ‚ такая строка ΠΊΠΎΠ΄Π° Π½Π΅ скомпилируСтся:

Но Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

Под маской ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π²ΠΎΡ‚ эту ΡˆΡ‚ΡƒΠΊΡƒ – » «.

А сСйчас ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ маску ΠΈ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊ компиляции:

ΠœΠ΅Ρ‚ΠΎΠ΄ printList ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π² сигнатурС использована маска:

И этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для списков с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Integer ΠΈ String).

Однако Π²ΠΎΡ‚ это Π½Π΅ скомпилируСтся:

И Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ малСнький ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π’ΡƒΡ‚ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ компиляции. Однако Π½Π΅Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Ρ‡Ρ‚ΠΎ пСрСмСнная numList Ρ…Ρ€Π°Π½ΠΈΡ‚ список со строками. Допустим Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‚Π°ΠΊ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Ρ…Ρ€Π°Π½ΠΈΠ»Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ списки чисСл. РСшСниС Π΅ΡΡ‚ΡŒ:

Π”Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π΅ скомпилируСтся, Π° всё ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ маски ΠΌΡ‹ Π·Π°Π΄Π°Π»ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ numList ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ссылку Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° список, содСрТащий элСмСнты унаслСдованныС ΠΎΡ‚ Number, Π° всё ΠΈΠ·-Π·Π° объявлСния: List numList. Π’ΡƒΡ‚ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ маскС задаётся ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ – Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ numList ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для списка с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ количСством Ρ‚ΠΈΠΏΠΎΠ². Double ΠΊΠ°ΠΊ ΠΈ Integer наслСдуСтся ΠΎΡ‚ Number, поэтому ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ скомпилируСтся.

Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ описано Π²Ρ‹ΡˆΠ΅ называСтся ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ масками (Bounded wildcards). ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΡ… конструкций ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вСсьма красивым ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ. Допустим Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ сумму чисСл Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранятся Π² ΠΎΠ΄Π½ΠΎΠΌ спискС:

Double-Ρ‚ΠΈΠΏ Π±Ρ‹Π» использован для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ result Ρ‚.ΠΊ. ΠΎΠ½ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ взаимодСйствуСт с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ числовыми Ρ‚ΠΈΠΏΠ°ΠΌΠΈ (Ρ‚.Π΅. Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ²).

На этом всС. НадСюсь, данная ΡΡ‚Π°Ρ‚ΡŒΡ Π±Ρ‹Π»Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ.

Если Π’Π°ΠΌ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»Π°ΡΡŒ ΡΡ‚Π°Ρ‚ΡŒΡ, проголосуйтС Π·Π° Π½Π΅Π΅

Голосов: 175 Π“ΠΎΠ»ΠΎΡΠΎΠ²Π°Ρ‚ΡŒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java

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

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎ PECS

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚. БСгодня я Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ PECS. Понимаю, Ρ‡Ρ‚ΠΎ сСйчас Π³ΡƒΡ€Ρƒ программирования ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΎΠΏΡ‹Ρ‚Π½Ρ‹Π΅ ΡΠ΅Π½ΡŒΠΎΡ€Ρ‹ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Ρ€Π°Π· Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π»ΠΈ ладонь Π² Π»ΠΈΡ†ΠΎ, ΠΈΠ±ΠΎ Β«Java Generics появились Π² JDK 1.5, которая Π²Ρ‹ΡˆΠ»Π° 30 сСнтября 2004 года…». Но Ссли Π΅ΡΡ‚ΡŒ Ρ‚Π΅, для ΠΊΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ PECS остаётся Ρ‚ΡƒΠΌΠ°Π½Π½Ρ‹ΠΌ ΠΈ нСпонятным, Π° ΡƒΠΏΠΎΡ€Π½ΠΎΠ΅ Π³ΡƒΠ³Π»Π΅Π½ΡŒΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сгущаСт Β«Ρ‚ΡƒΠΌΠ°Π½Β», Π΄ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚, Π±ΡƒΠ΄Π΅ΠΌ вмСстС Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π΄ΡƒΡ…ΠΎΠ²Π½ΠΎΠ³ΠΎ просвСтлСния. Π₯ΠΎΡ‡Ρƒ сразу ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΉ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ΅ Π½Π΅ рассматриваСтся, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ ΠΈ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard. Если Π²Ρ‹ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ понятиями, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ с Π½ΠΈΠΌΠΈ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ.

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд каТСтся, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ PECS достаточно прост. ВсС, ΠΊΡ‚ΠΎ встрСчался с Π½ΠΈΠΌ, Π·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ это Π°ΠΊΡ€ΠΎΠ½ΠΈΠΌ, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Β«Producer Extends Consumer SuperΒ». Как ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π² многочислСнных ΡΡ‚Π°Ρ‚ΡŒΡΡ…, Ссли Ρƒ нас Π΅ΡΡ‚ΡŒ нСкая коллСкция, типизированная wildcard с Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ (extends) – Ρ‚ΠΎ это, Β«ΠΏΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€Β». «Он Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Β«ΠΏΡ€ΠΎΠ΄ΡŽΡΠΈΡ€ΡƒΠ΅Ρ‚Β», прСдоставляСт элСмСнт ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π° сам Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚Β». Если ΠΆΠ΅ Ρƒ нас коллСкция, типизированная wildcard ΠΏΠΎ Π½ΠΈΠΆΠ½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ (super) – Ρ‚ΠΎ это, Β«ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Β«Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚, Π° ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Β».

Ну, Π²ΠΎΡ‚ собствСнно говоря ΠΈ всё. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΎΠ²Π»Π°Π΄Π΅Π»ΠΈ Β«Ρ‚Ρ‘ΠΌΠ½ΠΎΠΉ ΠΌΠ°Π³ΠΈΠ΅ΠΉΒ» PECS ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ смСло ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ Π½Π° собСсСдованиС Π² Π“ΡƒΠ³Π», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŒΡŽΠ΅Ρ€ΠΎΠ² своСй ΠΏΡ€Π΅ΠΌΡƒΠ΄Ρ€ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΎΠΏΡ‹Ρ‚Π½ΠΎΡΡ‚ΡŒΡŽ. ΠžΡΡ‚Π°Ρ‘Ρ‚ΡΡ ΠΎΠ΄Π½Π° нСбольшая Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π»ΡŽΠ±ΠΈΠΌΡƒΡŽ IDE ΠΈ для Π³Π°Π»ΠΎΡ‡ΠΊΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ всё Ρ‚Π°ΠΊ ΠΈ Π΅ΡΡ‚ΡŒ: ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅, ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎ Π½ΠΈΠΆΠ½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ потрСбитСлями.

Для наглядности прСдставим, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ иСрархия классов, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π°ΡΡΡ с Class0, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌ для Class1, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ являСтся ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌ для Class2, ΠΈ Ρ‚.Π΄. И Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ, Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ wildcard с Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ.

Богласно ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ PECS, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² Π΄Π°Π½Π½Ρ‹ΠΉ лист, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ поставщиком Π΄Π°Π½Π½Ρ‹Ρ….

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java

Досрочный ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½: ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, содСрТащиСся Π² list, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌΠΈ Class3, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈΠ· list ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Class4, Class5, Class6 ΠΈ Ρ‚.Π΄. Если Π²Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ, Ρ‚ΠΎ Ρƒ мСня для вас плохая Π½ΠΎΠ²ΠΎΡΡ‚ΡŒ – Β«ΠΎΡ‡ΠΊΠΎ ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ тСлСзритСлям»! Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ кусок ΠΊΠΎΠ΄Π° Π½Π΅ скомпилируСтся:

Π—Π°Ρ‚ΠΎ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ:

ΠžΡ‚ΡΡŽΠ΄Π° Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄: ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ списка ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ супСрклассов.

Но ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Ρ‚Π°ΠΊ? Π Π°Π·Π²Π΅ здСсь Π½Π΅Ρ‚ противорСчия? Лист содСрТит ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΈ для Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ класса, Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· Π½Π΅Π³ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏ класса-ΠΏΡ€Π΅Π΄ΠΊΠ°. На самом Π΄Π΅Π»Π΅, для компилятора здСсь всё ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ. Π’ΠΎ врСмя компиляции ΠΊΠΎΠ΄Π° нСизвСстно, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ класса Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π² листС. Допустим, это Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Class3. Π’ΠΎΠ³Π΄Π° Π² этой строкС

ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса-ΠΏΡ€Π΅Π΄ΠΊΠ° ΠΈ попытаСмся ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΈΠΌΠ΅ΡŽΡ‰ΡƒΡŽ Ρ‚ΠΈΠΏ класса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Ρ‡Π΅Π³ΠΎ Java ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСявно Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Ссли ΠΌΡ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ компилятору, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Π΅ΠΌ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠ°ΠΊΠΎΠ³ΠΎ класса Π±ΡƒΠ΄ΡƒΡ‚ Π»Π΅ΠΆΠ°Ρ‚ΡŒ Π² Π΄Π°Π½Π½ΠΎΠΌ листС, Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ смоТСм с Π½ΠΈΠΌ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒΡΡ.

Π‘ этим Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ. Но ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² Π΄Π°Π½Π½Ρ‹ΠΉ лист? Какая рСлигия Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ Π½Π°ΠΌ это Π΄Π΅Π»Π°Ρ‚ΡŒ?

И Ρ‚ΡƒΡ‚ ΠΌΡ‹ ΠΏΠ»Π°Π²Π½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ части ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° PECS – Β«consumer superΒ» (Β«wildcard с super β€” это consumer, ΠΎΠ½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚, Π° ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Β»).

Π­Ρ‚ΠΎ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π°ΠΉΠ»Π΄ΠΊΠ°Ρ€Π΄Ρ‹ java

И Ρ‚ΡƒΡ‚ встаёт послСдний вопрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… изучСния PECS: ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠ· ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ wildecard с Π½ΠΈΠΆΠ½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Object?

Если Π²Ρ‹ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ всё, Ρ‡Ρ‚ΠΎ написано Π²Ρ‹ΡˆΠ΅, Ρ‚ΠΎ ΡƒΠΆΠ΅, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, Π΄ΠΎΠ³Π°Π΄Ρ‹Π²Π°Π΅Ρ‚Π΅ΡΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ wildcard Π±ΡƒΠ΄Π΅Ρ‚ извСстСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π° коллСкция, состоящая ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹-ΠΏΡ€Π΅Π΄ΠΊΠΈ.

Если Π±Ρ‹ компилятор счёл Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Β«Π»Π΅Π³Π°Π»ΡŒΠ½Ρ‹ΠΌΒ» (вСдь Class2 являСтся супСрклассом для Class3)

Ρ‚ΠΎ ΠΌΠΎΠ³Π»Π° Π±Ρ‹ получится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ситуация: Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ List ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ List (ΠΎΠ±Π° ΠΎΠ½ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ маскС ) Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ (Class2 obj) Π±ΡƒΠ΄Π΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΏΡ€Π΅Π΄ΠΊΠ° ( list.get(0) ). ЕдинствСнный способ этого ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ – ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ· Ρ‚Π°ΠΊΠΎΠ³ΠΎ листа ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ, ΠΎΠ±Ρ‰ΠΈΠΉ для всСх Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Java, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Object.

Π’ΠΎΡ‚ ΠΈ всё, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ PECS. НадСюсь, ΠΌΠΎΡ‘ объяснСниС Π²Ρ‹ΡˆΠ»ΠΎ понятным ΠΈ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ страТдущим истины Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Π΄Π°Π½Π½ΠΎΠΌ вопросС.

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

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

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