Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Ѐилософия Java3Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 76

Автор Π‘Ρ€ΡŽΡ ЭккСль

Однако ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΈ Java SE5 Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ уточнСния записи посрСдством ограничСния Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Class, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ссылка; для этой Ρ†Π΅Π»ΠΈ примСняСтся синтаксис ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Π΅Ρ€Π½Ρ‹ ΠΎΠ±Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° синтаксиса:

// typeinfo/GenericClassReferences java

public class GenericClassReferences {

public static void main(String[] args) { Class intClass = int.class, Class<Integer> genericIntClass = int class; genericIntClass = Integer class; // To ТС самоС intClass = double.class,

// genericIntClass = double class; // НСдопустимо

}

} ///;-

Если обычная ссылка Π½Π° класс ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связана с Π»ΡŽΠ±Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Class, парамСтризованная ссылка ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ°, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈ Π΅Π΅ объявлСнии. Бинтаксис ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ позволяСт компилятору Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΈΠΏΠΎΠ².

Новый синтаксис прСобразования

Π’ Java SE5 Ρ‚Π°ΠΊΠΆΠ΅ появился Π½ΠΎΠ²Ρ‹ΠΉ синтаксис прСобразования ссылок Π½Π° Class, основанный Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ cast():

II typeinfo/ClassCasts java

class Building {}

class House extends Building {}

public class ClassCasts {

public static void main(String[] args) { Building b = new HouseO; Class<House> houseType = House class, House h = houseType cast(b); h = (House)b; II . А ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Ρ‚Π°ΠΊ.

}

} III ~

ΠœΠ΅Ρ‚ΠΎΠ΄ cast() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ ΠΊ Ρ‚ΠΈΠΏΡƒ ссылки Π½Π° Class. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΡ€ΠΈ взглядС Π½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ мСста ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с послСднСй строкой main(), которая Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС. Новый синтаксис прСобразования ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π² Ρ‚Π΅Ρ… ситуациях, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это происходит Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ написании ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° (см. Π΄Π°Π»Π΅Π΅) ссылка Π½Π° Class сохраняСтся для прСобразования Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ситуации Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΠΊΡ€Π°ΠΉΠ½Π΅ Ρ€Π΅Π΄ΠΊΠΎ β€” Π²ΠΎ всСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Java SE5 cast() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ всСго ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· (Π² com.sun.mirror.uti'LDeclarationFilter).

Другая новая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ β€” Class.asSubclass() β€” Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ встрСчаСтся Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Java SE5. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ позволяСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса ΠΊ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ²

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ рассмотрСли ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹ RTTI:

β€’ ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅; Π°Π½Π°Π»ΠΎΠ³ выраТСния Β«(Shape)Β», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ провСряСт, Β«Π·Π°ΠΊΠΎΠ½Π½ΠΎΒ» Π»ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π² Π΄Π°Π½Π½ΠΎΠΉ ситуации, ΠΈ Π² случаС Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ³ΠΎ прСобразования Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ClassCastException.

β€’ ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Class, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ вашСго ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. К ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Class ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ для получСния ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’ языкС Π‘++ классичСская Ρ„ΠΎΡ€ΠΌΠ° Ρ‚ΠΈΠΏΠ° Β«(Shape)Β» Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ задСйствуСт RTTI. Она просто сообщаСт компилятору, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΊΠ°ΠΊ с Π½ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ. Π’ языкС Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ провСряСт соотвСтствиС Ρ‚ΠΈΠΏΠΎΠ², Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ часто Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ «бСзопасным нисходящим ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ²Β». Π‘Π»ΠΎΠ²ΠΎ «нисходящСС» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² силу Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΉ, ΡΠ»ΠΎΠΆΠΈΠ²ΡˆΠΈΡ…ΡΡ Π² ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ составлСния Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌ наслСдования. Если ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ окруТности Circle ΠΊ Ρ„ΠΈΠ³ΡƒΡ€Π΅ Shape являСтся восходящим, Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ Shape ΠΊ окруТности Circle являСтся, соотвСтствСнно, нисходящим. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Circle являСтся частным случаСм Shape, ΠΎΠ½ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ «восходящСС» присваиваниС Π±Π΅Π· явного прСобразования Ρ‚ΠΈΠΏΠ°. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² Π½Π΅ΠΊΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Shape, компилятор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»: Ρ‚ΠΎ Π»ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Shape, Ρ‚ΠΎ Π»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² (Circle, Square ΠΈΠ»ΠΈ Triangle). На стадии компиляции ΠΎΠ½ Π²ΠΈΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Shape ΠΈ поэтому Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ «нисходящСС» присваиваниС Π±Π΅Π· явного прСобразования Ρ‚ΠΈΠΏΠ°.

БущСствуСт ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΡ Ρ„ΠΎΡ€ΠΌΠ° RTTI Π² Java β€” ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово instanceof, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ провСряСт, являСтся Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ экзСмпляром Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ возвращаСтся Π² логичСском (boolean) Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, поэтому Π²Ρ‹ просто Β«Π·Π°Π΄Π°Π΅Ρ‚Π΅Β» вопрос Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΠ΅:

if(x instanceof Dog) ((Dog)x).bark().

Команда if сначала провСряСт, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ… классу Dog, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС этого выполняСт ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊ Ρ‚ΠΈΠΏΡƒ Dog. ΠΠ°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово instanceof ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ нисходящСго прСобразования, особСнно ΠΏΡ€ΠΈ нСдостаткС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎΠΌ Ρ‚ΠΈΠΏΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°; ΠΈΠ½Π°Ρ‡Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ClassCastException.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ проводится поиск ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, поиск Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² срСди ΠΏΡ€ΠΎΡ‡ΠΈΡ… Ρ„ΠΈΠ³ΡƒΡ€), Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова instanceof Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Ρ‚ΠΈΠΏΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ иСрархия классов для описания Π΄ΠΎΠΌΠ°ΡˆΠ½ΠΈΡ… ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ… Pet (ΠΈ ΠΈΡ… Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅Π² β€” эта ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ пригодится Π½Π°ΠΌ Π² Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅). КаТдоС сущСство (Individual) Π² этой ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ id ΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ

ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄ Individual нас Π½Π΅ интСрСсуСт β€” достаточно Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈΠ»ΠΈ Π±Π΅Π·, ΠΈ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Individual имССтся ΠΌΠ΅Ρ‚ΠΎΠ΄ id(), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. Π’Π°ΠΊΠΆΠ΅ имССтся ΠΌΠ΅Ρ‚ΠΎΠ΄ toString(); Ссли имя Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, toStringO Π²Ρ‹Π΄Π°Π΅Ρ‚ имя Ρ‚ΠΈΠΏΠ°. Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ классов, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΎΡ‚ Individual:

// typeinfo/pets/Person.java package typeinfo.pets;

public class Person extends Individual {

public Person(String name) { super(name), } } III:-

//: typeinfo/pets/Pet.java package typeinfo pets;

public class Pet extends Individual {

public Pet(String name) { super(name), } public Pet О { superO. } } ///.-

//: typeinfo/pets/Dog.java package typeinfo.pets,

public class Dog extends Pet {

public Dog(String name) { super(name), } public Dog О { superO, } } Hill: typeinfo/pets/Mutt java package typeinfo pets;

public class Mutt extends Dog {

public Mutt(String name) { super(name); } public Mutt О { superO; } } ///.-

II: typeinfo/pets/Pug java package typeinfo pets;

public class Pug extends Dog {

public Pug(String name) { super(name); } public PugO { superO; } } Hill. typeinfo/pets/Cat java package typeinfo pets,

public class Cat extends Pet {

public Cat(String name) { super(name), } public CatO { superO, } } lll-

IH typeinfo/pets/EgyptianMau java package typeinfo.pets;

public class EgyptianMau extends Cat { ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ &

public EgyptianMau(String name) { super(name); } public EgyptianMau() { superO; } } /// -

// typeinfo/pets/Manx java package typeinfo pets,

public class Manx extends Cat {

public Manx(String name) { super(name); } public ManxO { superO; }

} 111

II typeinfo/pets/Cymric java package typeinfo pets,

public class Cymric extends Manx {

public Cymric(String name) { super(name). } public CymricO { superO; } } III -

II. typeinfo/pets/Rodent java package typeinfo pets,

public class Rodent extends Pet {

public Rodent(String name) { super(name), } public RodentO { superO; } } III -

II' typeinfo/pets/Rat java package typeinfo pets,

public class Rat extends Rodent {

public Rat(String name) { super(name); } public RatO { superO; } } Hill' typeinfo/pets/Mouse java package typeinfo pets;

public class Mouse extends Rodent {

public Mouse(String name) { super(name); } public MouseO { superO, } } ///:-

II typeinfo/pets/Hamster java package typeinfo pets.

public class Hamster extends Rodent {

public Hamster(String name) { super(name); } public HamsterO { superO; } } ///:-

Π—Π°Ρ‚Π΅ΠΌ Π½Π°ΠΌ понадобятся срСдства для создания случайных Ρ‚ΠΈΠΏΠΎΠ² Pet, Π° для удобства β€” массивов ΠΈ списков (List) с элСмСнтами Pet. Π§Ρ‚ΠΎΠ±Ρ‹ этот инструмСнтарий ΠΌΠΎΠ³ Β«ΠΏΠ΅Ρ€Π΅ΠΆΠΈΡ‚ΡŒΒ» нСсколько Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ абстрактного класса:

// typeinfo/pets/PetCreator java // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ случайных ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ Pet package typeinfo pets, import java util *,

public abstract class PetCreator {

private Random rand = new Random(47), // Бписок создаваСмых Ρ‚ΠΈΠΏΠΎΠ², ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΎΡ‚ Pet public abstract List<Class<? extends PetΒ» typesO. public Pet randomPetO { // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ случайного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Pet int n = rand next Int (types О sizeO), try {

return typesO get(n) newInstanceO. } catchdnstantiationException e) {

throw new RuntimeException(e), } catchdllegalAccessException e) {

throw new RuntimeException(e).

}

}

public Pet[] createArray(int size) { Pet[] result = new Pet[size], for(int i = 0. i < size, i++)

result[i] = randomPetO. return result;

}

public ArrayList<Pet> arrayList(int size) {

ArrayList<Pet> result = new ArrayList<Pet>(), Collections addAll(result, createArray(size)), return result,

}

} /// ~

Абстрактный ΠΌΠ΅Ρ‚ΠΎΠ΄ getTypes() ΠΏΠΎΡ€ΡƒΡ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌΡƒ классу ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ списка ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Class. Π’ качСствС Ρ‚ΠΈΠΏΠ° класса ΡƒΠΊΠ°Π·Π°Π½ «любой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ PetΒ», поэтому newlnstance() создаСт Pet Π±Π΅Π· нСобходимости прСобразования Ρ‚ΠΈΠΏΠ°. ΠœΠ΅Ρ‚ΠΎΠ΄ randomPet() осущСствляСт ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΡƒΡŽ Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ ΠΈΠ· List ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Class для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Class. newlnstance(). ΠœΠ΅Ρ‚ΠΎΠ΄ createArray() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ randomPet() для заполнСния массива, a arrayList(), Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ createArray().

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ newlnstance() Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ Π΄Π²Π° Π²ΠΈΠ΄Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π² сСкциях catch Π·Π° Π±Π»ΠΎΠΊΠΎΠΌ try. ИмСна ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ достаточно Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‚ ΡΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ (IllegalAccessException β€” Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° бСзопасности Java, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Ссли конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ объявлСн private).

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡ субкласс PetCreator, достаточно ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ список Ρ‚ΠΈΠΏΠΎΠ² Pet, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ с использованиСм randomPet() ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². ΠœΠ΅Ρ‚ΠΎΠ΄ getTypes() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку Π½Π° статичСский ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ List. РСализация с использованиСм forName() выглядит Ρ‚Π°ΠΊ:

//β€’ typei nfo/pets/ForNameCreator.java package typeinfo pets; import java util *;

public class ForNameCreator extends PetCreator {

private static List<Class<? extends PetΒ» types =

new ArrayList<Class<? extends PetΒ»(). Π› Π›

ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ &

II Π’ΠΈΠΏΡ‹, создаваСмыС случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, private static StringE] typeNames = { "typeinfo pets.Mutt", "typeinfo pets Pug", "typeinfo pets EgyptianMau", "typeinfo pets.Manx", "typeinfo.pets.Cymric", "typeinfo.pets.Rat", "typeinfo.pets.Mouse", "typeinfo pets.Hamster"

}:

@SuppressWarni ngs("unchecked") private static void loaderO { try {

for(String name : typeNames) types.add(

(Class<? extends Pet>)Class forName(name)). } catch(ClassNotFoundException e) {

throw new RuntimeException(e);

}

}

static { loaderO; }

public List<Class<? extends Pet» types О {return types,} } ///:-

ΠœΠ΅Ρ‚ΠΎΠ΄ loader() создаСт список List ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Class с использованиСм ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Class.forName(). ΠŸΡ€ΠΈ этом ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ClassNotFoundException, Ρ‡Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ понятно β€” вСдь Π΅ΠΌΡƒ пСрСдаСтся строка, содСрТимоС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π° стадии компиляции. ΠŸΡ€ΠΈ ссылкС Π½Π° эти классы Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ имя ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ (typeinfo).