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

Wildcards

Consider the problem of writing a routine that prints out all the elements in a collection. Here’s how you might write it in an older version of the language (that is, a pre-5.0 release):

And here is a naive attempt at writing it using generics (and the new for loop syntax):

So what is the supertype of all kinds of collections? It’s written Collection (pronounced «collection of unknown»), that is, a collection whose element type matches anything. It’s called a wildcard type for obvious reasons. We can write:

Bounded Wildcards

Consider a simple drawing application that can draw shapes such as rectangles and circles. To represent these shapes within the program, you could define a class hierarchy such as this:

These classes can be drawn on a canvas:

Any drawing will typically contain a number of shapes. Assuming that they are represented as a list, it would be convenient to have a method in Canvas that draws them all:

There is, as usual, a price to be paid for the flexibility of using wildcards. That price is that it is now illegal to write into shapes in the body of the method. For instance, this is not allowed:

Bounded wildcards are just what one needs to handle the example of the DMV passing its data to the census bureau. Our example assumes that the data is represented by mapping from names (represented as strings) to people (represented by reference types such as Person or its subtypes, such as Driver ). Map is an example of a generic type that takes two type arguments, representing the keys and values of the map.

Again, note the naming convention for formal type parameters— K for keys and V for values.

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

ИспользованиС 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 ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹, Π²Ρ‹ ΡƒΠΆΠ΅ просто Π½Π΅ смоТСтС Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΅ΠΉ Π² дальнСйшСм.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard 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 ΠΈ выглядит Ρ‚Π°ΠΊ:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard 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, ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰Π°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ)

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

Π—Π° основу Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π±Ρ‹Π»Π° взята информация ΠΈΠ· 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 Π“ΠΎΠ»ΠΎΡΠΎΠ²Π°Ρ‚ΡŒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ wildcard java

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

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

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