ΠΠ»Π°Π²Π½Π°Ρ ΠΏΡΠΈΡΠΈΠ½Π° Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠΈΡΠ°Π½ΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΈ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ. ΠΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΡΠ°ΡΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΡ. ΠΠ°Π²Π΅ΡΠ½ΠΎΠ΅, Π² ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎΠΌ ΠΌΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΡ Π±ΡΠ»Π° Π±Ρ Π²Π½Π΅Π΄ΡΠ΅Π½Π° Π²Π΅Π·Π΄Π΅ ΠΈ ΠΏΠΎΠ²ΡΡΠ΄Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. ΠΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΎΠ½ ΠΏΠΈΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄, ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΈΠΌΠ΅ΡΡ Π΄Π΅Π»ΠΎ Ρ ^ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΌΠΈ Π΄ΠΎ Java SE5. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π°Π²ΡΠΎΡΡ ΡΡΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ Π½Π°ΠΌΠ΅ΡΠ΅Π½Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉ ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ.
ΠΠ·-Π·Π° ΡΡΠΎΠ³ΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ Java ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ (ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ ΠΈ ΡΠ°ΠΉΠ»Ρ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΎΡΡΠ°ΡΡΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π·Π°ΠΊΠΎΠ½Π½ΡΠΌΠΈ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΡΠ²ΠΎΠΉ ΠΏΡΠ΅ΠΆΠ½ΠΈΠΉ ΡΠΌΡΡΠ»), Π½ΠΎ ΠΈ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ β ΡΡΠΎΠ±Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡΡΡ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ ΡΠΎΡΠΌΡ Π² ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΡΠ΅ΠΌΠΏΠ΅, ΠΏΡΠΈΡΠ΅ΠΌ ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΡ Π½Π΅ Π²Π»ΠΈΡΠ»Π° Π±Ρ Π½Π° ΡΠ°Π±ΠΎΡΡ Π·Π°Π²ΠΈΡΡΡΠ΅Π³ΠΎ ΠΎΡ Π½Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠΡΠ±ΡΠ°Π² ΡΡΡ ΡΠ΅Π»Ρ, ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²ΡΠΈΠΊΠΈ Java ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π³ΡΡΠΏΠΏΡ, ΡΠ°Π±ΠΎΡΠ°Π²ΡΠΈΠ΅ Π½Π°Π΄ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΡΠ΅ΡΠΈΠ»ΠΈ, ΡΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠΈΡΠ°Π½ΠΈΠ΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅Π΅ Π½Π΅ΠΏΠ°ΡΠ°ΠΌΠ΅Ρ-ΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΠΊΠΎΠ΄Ρ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΡΠΎΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ.
ΠΡΠΎΠ±Π»Π΅ΠΌΡ ΡΡΠΈΡΠ°Π½ΠΈΡ
ΠΡΠ°ΠΊ, Π³Π»Π°Π²Π½ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠΈΡΠ°Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Ρ Π½Π΅ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ Π² ΡΠ·ΡΠΊ Π±Π΅Π· Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ. Π‘ΡΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ^ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΏΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π³ΠΎΡΠΎΠ² ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΉ ΠΊΠΎΠ΄ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ.
ΠΠ΄Π½Π°ΠΊΠΎ Π·Π° ΡΡΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠ°ΡΠΏΠ»Π°ΡΠΈΠ²Π°ΡΡΡΡ. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΈΠΏΡ Π½Π΅ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡ , Π² ΠΊΠΎΡΠΎΡΡΡ ΡΠ²Π½ΠΎ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π½Ρ ΡΠΈΠΏΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ β ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠΎΠ², instanceof ΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ new. ΠΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΈΠΏΠ°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠ΅ΡΡΠ΅ΡΡΡ, ΠΈ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π²Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡ ΡΠ΅Π±Π΅ ΠΎΠ± ΡΡΠΎΠΌ. ΠΠΎΠΏΡΡΡΠΈΠΌ, Π²Ρ ΠΏΠΈΡΠ΅ΡΠ΅ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π°
class Foo<T> { Π’ var;
}
ΠΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ, ΡΡΠΎ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Foo:
Foo<Cat> f = new Foo<Cat>(),
ΠΊΠΎΠ΄ class Foo Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°ΡΡ, ΡΡΠΎ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ Cat. Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΡΠΎΠ·Π΄Π°Π΅Ρ Π²ΠΏΠ΅ΡΠ°ΡΠ»Π΅Π½ΠΈΠ΅, ΡΡΠΎ ΡΠΈΠΏ Π’ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ²ΡΡΠ΄Ρ Π²Π½ΡΡΡΠΈ ΠΊΠ»Π°ΡΡΠ°. ΠΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΠΎ Π½Π΅ ΡΠ°ΠΊ, ΠΈ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ° Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡ ΡΠ΅Π±Π΅: Β«ΠΠ΅Ρ, ΡΡΠΎ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ObjectΒ».
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΡΠΈΡΠ°Π½ΠΈΠ΅ ΠΈ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΎΠ½Π½Π°Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ ΠΎΠ·Π½Π°ΡΠ°ΡΡ, ΡΡΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π·Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΠΆΠ΅ΡΡΠΊΠΈΠΉ, ΠΊΠ°ΠΊ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ:
//: generics/ErasureAndlnheritance.java
class GenericBase<T> { private T element;
public void set(T arg) { arg = element; } public T get Π { return element. }
}
class Derivedl<T> extends GenericBase<T> {}
class Derived2 extends GenericBase {} // ΠΠ΅Π· ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ
// class Derived3 extends GenericBase<?> {}
// Π‘ΡΡΠ°Π½Π½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°.
// ΠΠ±Π½Π°ΡΡΠΆΠ΅Π½ Π½Π΅ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½Π½ΡΠΉ ΡΠΈΠΏ : ?
// ΡΡΠ΅Π±ΡΠ΅ΡΡΡ- ΠΊΠ»Π°ΡΡ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π±Π΅Π· ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ
public class ErasureAndlnheritance { @SuppressWarni ngs("unchecked") public static void main(String[] args) { Derived2 d2 = new Derived2(); Object obj = d2.get(); d2.set(obj); // ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅!
}
} ///
Derived2 Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΡ GenericBase Π±Π΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ, ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ Π²ΡΠ΄Π°Π΅Ρ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ. ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅, ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ set().
ΠΠ»Ρ ΠΏΠΎΠ΄Π°Π²Π»Π΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ Π² Java ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π°, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ (Π΄ΠΎ Π²ΡΡ ΠΎΠ΄Π° Java SE5 ΠΎΠ½Π° Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π»Π°ΡΡ):
@SuppressWarnings("unchecked")
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊ ΠΌΠ΅ΡΠΎΠ΄Ρ, Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΠ΅ΠΌΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Π° Π½Π΅ ΠΊΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ»Π°ΡΡΡ. ΠΡΠΈ ΠΏΠΎΠ΄Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Π² ΡΠ°ΠΌΡΡ ΡΠ·ΠΊΠΈΡ ΡΠ°ΠΌΠΊΠ°Ρ , ΡΡΠΎΠ±Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π½Π΅ ΡΠΊΡΡΡΡ Π½Π°ΡΡΠΎΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΡΠΈΠ±ΠΊΠ°, Π²ΡΠ΄Π°Π²Π°Π΅ΠΌΠ°Ρ Π² Derived3, ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ Β«ΠΎΠ±ΡΡΠ½ΡΠΉΒ» Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ.
ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΠΊ ΡΡΠΎΠΌΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠΈΠ»ΠΈΡ Π½Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ, Π΅ΡΠ»ΠΈ Π²Ρ Π½Π΅ ΠΆΠ΅Π»Π°Π΅ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ° ΠΊΠ°ΠΊ ΠΏΡΠΎΡΡΠΎΠΉ Object, β ΠΈ ΡΡΠΎ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π² ΠΎΡΡΠ°ΡΠΊΠ΅? ΠΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Ρ Π»ΠΎΠΏΠΎΡ ΠΏΡΠΈ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΌΠ΅Π½ΡΡΠ΅, ΠΏΠΎΠ»ΡΠ·Π΅ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ Π² ΡΠ·ΡΠΊΠ°Ρ Π²ΡΠΎΠ΄Π΅ Π‘++, Ada ΠΈΠ»ΠΈ Eiffel. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΡΠΎ Π²ΠΎΠ²ΡΠ΅ Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΡΠΈ ΡΠ·ΡΠΊΠΈ Π² ΡΠ΅Π»ΠΎΠΌ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π΅Π΅ Java Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ Π·Π°Π΄Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π° Π³ΠΎΠ²ΠΎΡΠΈΡ Π»ΠΈΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΈΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠΈΠΏΠΎΠ² ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ΠΉ Π³ΠΈΠ±ΠΊΠΎΡΡΡΡ ΠΈ ΠΌΠΎΡΡΡ, ΡΠ΅ΠΌ Π² Java.
ΠΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π° Π³ΡΠ°Π½ΠΈΡΠ°Ρ
ΠΠΎΠΆΠ°Π»ΡΠΉ, ΡΠ°ΠΌΡΠΉ ΡΡΡΠ°Π½Π½ΡΠΉ Π°ΡΠΏΠ΅ΠΊΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ, ΠΎΠ±ΡΡΠ»ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ ΡΡΠΈΡΠ°Π½ΠΈΠ΅ΠΌ, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΡΡ Π²Π΅ΡΠ΅ΠΉ. ΠΡΠΈΠΌΠ΅Ρ:
//: generics/ArrayMaker.java
import java.lang.reflect.*;
import java.util.*;
public class ArrayMaker<T> { private Class<T> kind;
public ArrayMaker(Class<T> kind) { this.kind = kind; } @SuppressWarni ngs("unchecked") T[] create(int size) {
return (T[])Array.newInstance(kind, size);
}
public static void main(String[] args) { ArrayMaker<String> stringMaker =
new ArrayMaker<String>(String.class); String[] stringArray = stringMaker.create(9); System.out.pri ntin(Arrays.toStri ng(stri ngArray));
}
} /* Output;
[null, null, null. null. null. null. null. null, null]
*///:-
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ kind Ρ ΡΠ°Π½ΠΈΡΡΡ Π² Π²ΠΈΠ΄Π΅ Class<T>, ΡΡΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ½ Ρ ΡΠ°Π½ΠΈΡΡΡ Π² Π²ΠΈΠ΄Π΅ Class Π±Π΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ Π½ΠΈΠΌ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΌΠ°ΡΡΠΈΠ²Π°) Array. newlnstance() Π½Π΅ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎ ΡΠΈΠΏΠ΅, ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅ΠΌΠΎΠΉ kind. ΠΠ΅ΡΠΎΠ΄ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ΄Π°ΡΡ Π½ΡΠΆΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, Π½Π΅ ΡΡΠ΅Π±ΡΡΡΠΈΠΉ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠ°, Π° ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π²ΡΠ΄Π°ΡΠ΅ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ, Ρ ΠΊΠΎΡΠΎΡΡΠΌ Π²Π°ΠΌ Π½Π΅ ΡΠ΄Π°ΡΡΡΡ ΡΠΏΡΠ°Π²ΠΈΡΡΡΡ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Array.newlnstance().
ΠΡΠ»ΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΡΠΈΡΡΠ°ΡΠΈΡ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ:
//: generics/ListMaker.java
import java util.*;
public class ListMaker<T> {
List<T> create Π { return new ArrayList<T>(); } public static void main(String[] args) {
ListMaker<String> stringMaker= new ListMaker<String>(); List<String> stringList = stringMaker.createO;
}
} ///:-
ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ Π²ΡΠ΄Π°Π΅Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ, Ρ ΠΎΡΡ ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ <Π’> Π² new ArrayList<T>() Π²Π½ΡΡΡΠΈ create() ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ β Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ <Π’> Π²Π½ΡΡΡΠΈ ΠΊΠ»Π°ΡΡΠ° Π½Π΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π·Π΄Π΅ΡΡ Π΅Π³ΠΎ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΈΠ΅ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΡΠΌ. ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΡ ΠΈΠ΄Π΅Ρ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² new ArrayList(), ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π²ΡΠ΄Π°ΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅.
ΠΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΠΈ ΡΡΠΎΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ»Π°? Π§ΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ, Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠΌ Π² ΡΠΏΠΈΡΠΎΠΊ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π²ΠΎΠ·Π²Π°ΡΠΈΠΌ Π΅Π³ΠΎ?
II: generics/Fi1ledListMaker java
import java.util.*;
public class FilledListMaker<T> { List<T> create(T t, int n) {
List<T> result = new ArrayList<T>(); for(int i = 0: i < n; i++)
result.add(t); return result:
}
public static void main(String[] args) {
FilledListMaker<String> stringMaker =
new Fi11edListMaker<String>(); List<String> list = stringMaker.createC'Hello", 4): System.out.pri ntln(1i st);
}
} /* Output:
[Hello, Hello. Hello. Hello]
*lll:~
Π₯ΠΎΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π·Π½Π°ΡΡ ΠΎ Π’ Π² create(), ΠΎΠ½ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΡΠΏΠΎΡΠΎΠ±Π΅Π½ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ β Π½Π° ΡΡΠ°Π΄ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ β ΡΡΠΎ Π·Π°Π½ΠΎΡΠΈΠΌΡΠ΅ Π² result ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈΠΌΠ΅ΡΡ ΡΠΈΠΏ Π’ ΠΈ ΡΠΎΠ³Π»Π°ΡΡΡΡΡΡ Ρ ArrayList<T>. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ ΡΡΠΎ ΡΡΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ΄Π°Π»ΡΠ΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΡΠΈΠΏΠ΅ Π²Π½ΡΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΊΠ»Π°ΡΡΠ°, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠ° Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ ΠΈΠ»ΠΈ ΠΊΠ»Π°ΡΡΠ΅.
Π’Π°ΠΊ ΠΊΠ°ΠΊ ΡΡΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ΄Π°Π»ΡΠ΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΈΠΏΠ΅ Π²Π½ΡΡΡΠΈ ΡΠ΅Π»Π° ΠΌΠ΅ΡΠΎΠ΄Π°, Π½Π° ΡΡΠ°Π΄ΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΡΠΎΠ±ΡΡ ΡΠΎΠ»Ρ ΠΏΡΠΈΠΎΠ±ΡΠ΅ΡΠ°ΡΡ Π³ΡΠ°Π½ΠΈΡΡ β ΡΠΎΡΠΊΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π²Ρ ΠΎΠ΄ΠΈΡ ΠΈ Π²ΡΡ ΠΎΠ΄ΠΈΡ ΠΈΠ· ΠΌΠ΅ΡΠΎΠ΄Π°. ΠΠΌΠ΅Π½Π½ΠΎ Π² ΡΡΠΈΡ ΡΠΎΡΠΊΠ°Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΠΈΠΏΠΎΠ² ΠΈ Π²ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠΎΠ΄ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ^ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ:
// generics/SimpleHolder.java
public class SimpleHolder { private Object obj;
public void set(Object obj) { this.obj = obj; } public Object get Π { return obj; } public static void main(String[] args) {
SimpleHolder holder = new SimpleHolder().
holder set("Item"),
String s = (String)holder getO:
}
} ///-
ΠΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ javap -Ρ SimpleHolder, ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ (ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ):
public
void set(java lang Object);
0
aload_0
1:
aload 1
2:
putfield #2; II ΠΠΎΠ»Π΅ obj.Object;
5.
return
public
java lang.Object getO.
0;
aload 0
1-
getfield #2; II ΠΠΎΠ»Π΅ obj-Object,
4
areturn
public
static void main(java 1ang.String[]);
0:
new #3, // ΠΠ»Π°ΡΡ SimpleHolder
3-
dup
4:
invokespecial #4; // ΠΠ΅ΡΠΎΠ΄ "<init>".()V
7.
astore_l
8-
aload 1
9.
ldc #5; II String Item
11
invokevirtual #6; // ΠΠ΅ΡΠΎΠ΄ set (Object;)V
14:
aload_l
15.
invokevirtual #7, // ΠΠ΅ΡΠΎΠ΄ get:()Object:
18;
checkcast #8, //'ΠΠ»Π°ΡΡ java/lang/String
21:
astore_2
22.
return
ΠΠ΅ΡΠΎΠ΄Ρ set() ΠΈ get() ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ ΠΈ ΡΠΈΡΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π² ΡΠΎΡΠΊΠ΅ Π²ΡΠ·ΠΎΠ²Π° get().
Π’Π΅ΠΏΠ΅ΡΡ Π²ΠΊΠ»ΡΡΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΡ Π² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ:
II: generics/GenericHolder.java
public class GenericHolder<T> { private T obj,
public void set(T obj) { this.obj = obj; } public T get Π { return obj; } public static void main(String[] args) { GenericHolder<String> holder =
new GenericHolder<String>(); holder.set("Item"); String s = holder.get Π;
}
ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ get() ΠΎΡΠΏΠ°Π»Π°, Π½ΠΎ ΠΌΡ ΡΠ°ΠΊΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΡΠΈΠΏ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ set(), ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π±Π°ΠΉΡ-ΠΊΠΎΠ΄:
public void set(java.lang.Object);
0:
aload_0
1:
aload_l
2:
putfield #2; // ΠΠΎΠ»Π΅ obj:0bject;
5:
return
public java.lang.Object getO;
0:
aload_0
1:
getfield #2; // ΠΠΎΠ»Π΅ obj:0bject;
4:
areturn
public static void main(java.lang.String[]);
0.
new #3; // ΠΠ»Π°ΡΡ GenericHolder
3:
dup
4:
invokespecial #4; // ΠΠ΅ΡΠΎΠ΄ "<init>"-()V
7:
astore_l
8:
aload_l
9:
ldc #5; // String Item
11