ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²ΡΠΈΠΊΠΈ 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).