Integer[] ia = gai.rep(); } catch(Exception e) { System.out.printin(e); }
}
} /* Output: (Sample)
0 12 3 4 5 6 7 8 9
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer,
ΠΠ° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄ ΠΏΠΎΡΡΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ, ΡΠ°Π·Π²Π΅ ΡΡΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Π±ΡΠ»ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΎ. ΠΠ΅Π· Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² @SuppressWarnings Π²Ρ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ Π±ΡΠ΄Π΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ, Π½ΠΎ ΡΠ΅ΠΏΠ΅ΡΡ Π²ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Object[] Π²ΠΌΠ΅ΡΡΠΎ Π’[]. ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ get() ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ ΠΊ Π’; ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΡΠΈΠΏ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ. ΠΠΎ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ Π³Π΅Ρ() ΡΠ½ΠΎΠ²Π° Π΄Π΅Π»Π°Π΅ΡΡΡ ΠΏΠΎΠΏΡΡΠΊΠ° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Object[] Π² Π’[], ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΡΡΠ°Π΅ΡΡΡ Π½Π΅Π²Π΅ΡΠ½ΡΠΌ; Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠΏΠΎΡΠΎΠ±Π° ΠΎΠ±ΠΎΠΉΡΠΈ ΡΠΈΠΏ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°, ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Object[]. Π£ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΉ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΈΠΈ array ΠΊΠ°ΠΊ Object[] Π²ΠΌΠ΅ΡΡΠΎ Π’[] Π΅ΡΡΡ ΡΠ²ΠΎΠΈ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²Ρ Ρ ΠΌΠ΅Π½ΡΡΠ΅ΠΉ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΡ Π·Π°Π±ΡΠ΄Π΅ΡΠ΅ ΡΠΈΠΏ ΠΌΠ°ΡΡΠΈΠ²Π°, ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΌΡ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ (Π²ΠΏΡΠΎΡΠ΅ΠΌ, ΠΏΠΎΠ΄Π°Π²Π»ΡΡΡΠ΅Π΅ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΠ°ΠΊΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ Π±ΡΠ΄Π΅Ρ Π±ΡΡΡΡΠΎ Π²ΡΡΠ²Π»Π΅Π½ΠΎ Π½Π° ΡΡΠ°Π΄ΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ).
Π Π½ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΌΠ΅ΡΠΊΡ ΡΠΈΠΏΠ°. Π ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Generic-Array Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
//: generics/Generic/\rrayWithTypeToken.java
import java.lang.reflect.*;
public class GenericArrayWithTypeToken<T> { private T[] array; @SuppressWarni ngs("unchecked")
public GenericArrayWithTypeToken(CIass<T> type, int sz) { array = (T[])Array.newInstance(type, sz);
}
public void put(int index, T item) { arrayCindex] = item;
}
public T get(int index) { return arrayCindex]; } // Expose the underlying representation: public T[] rep() { return array; } public static void main(String[] args) {
GenericArrayWithTypeToken<Integer> gai =
new Generi cArrayWi thTypeToken<Integer>( Integer.class, 10);
// This now works:
Integer[] ia = gai.rep();
}
} ///
ΠΠ΅ΡΠΊΠ° ΡΠΈΠΏΠ° Class<T> ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠΈΡΠ°Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠΈΠΏ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° (ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΡΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΠ΄Π°Π²Π»ΡΡΡ @SuppressWarnings). ΠΠΎΠ»ΡΡΠΈΠ² ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠΈΠΏ, ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π΅Π³ΠΎ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΆΠ΅Π»Π°Π΅ΠΌΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ², ΠΊΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· main().
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅Π² ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ Java SE5, Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² Object Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΈΠΏΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡ ΠΏΠΎΠ²ΡΠ΅ΠΌΠ΅ΡΡΠ½ΠΎ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΠΎΡ ΠΊΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΊΠΎΠΏΠΈΡΡΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ArrayList ΠΈΠ· Collection ΠΏΠΎΡΠ»Π΅ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠ°Π²ΠΊΠΈ ΠΈ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ:
public ArrayList(Collection Ρ) { size = c.sizeO;
elementData = (E[])new Object[size]; Ρ.toArray(elementData):
}
Π ArrayList.java ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ. Π ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΏΡΠΈ ΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π²ΡΠ΄Π°Π΅ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ.
ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ
ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π²ΡΠΈΠ΅ΡΡ ΡΠ°Π½Π΅Π΅ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅, ΡΡΠΆΠ°ΡΡ ΠΊΡΡΠ³ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠΈΠΏΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΏΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ. Π₯ΠΎΡΡ ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ²Π»ΡΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΡΠΈΠΏΠ°ΠΌ, ΠΊ ΠΊΠΎΡΠΎΡΡΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π²Π°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄, Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΈ Π΄ΡΡΠ³ΠΎΠΉ, ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΡΠΉ ΡΡΡΠ΅ΠΊΡ: Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ Π² ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΠΈΡ ΡΠΈΠΏΠ°Ρ .
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ½ΠΈΡΡΠΎΠΆΠ°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΈΠΏΠ΅, ΠΏΡΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠΈΠΏΠΎΠ² ΠΌΠΎΠ³ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄Ρ Object. ΠΠΎ, Π΅ΡΠ»ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ ΡΠΈΠΏΠΎΠ², Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°. ΠΠ»Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π² Java ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ extends. ΠΠ°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΡΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ extends ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΠΈΠ½ΠΎΠΉ ΡΠΌΡΡΠ», Π½Π΅ΠΆΠ΅Π»ΠΈ Π² ΠΎΠ±ΡΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ. Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΠΎΡΠ½ΠΎΠ²Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ:
//: generics/BasicBounds.java
interface HasColor { java. awt. Col or getColorO; }
class Colored<T extends HasColor> { T item:
Colored(T item) { this.item = item; }
T getltemO { return item; }
// ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄:
java. awt. Col or colore) { return item.getColorO; }
}
class Dimension { public int x, y. z; }
// ΠΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ -- ΡΠ½Π°ΡΠ°Π»Π° ΠΊΠ»Π°ΡΡ, ΠΏΠΎΡΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ: // class ColoredDimensiΠΎΠ»<Π’ extends HasColor & Dimension> {
// ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ-
class ColoredDimension<T extends Dimension & HasColor> { T item:
ColoredDimension(T item) { this.item = item, }
T getltemO { return item, }
java. awt. Col or colorO { return item getColorO; }
int getXO { return item.x; }
int getYO { return item.Ρ, }
int getZO { return item z; }
}
interface Weight { int weightO; }
// ΠΠ°ΠΊ ΠΈ ΠΏΡΠΈ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½, // Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ: class Solid<T extends Dimension & HasColor & Weight> { T item;
Solid(T item) { this.item = item. }
T get ItemΠ { return item; }
java.awt Color col orΠ { return item.getColor(); }
int getXO { return item x; }
int getYO { return item Ρ; }
int getZO { return item.z; }
int weightO { return item, weight Π; }
}
class Bounded
extends Dimension implements HasColor. Weight {
public java.awt.Col or getColorO { return null; } public int weightO { return 0; }
}
public class BasicBounds {
public static void main(String[] args) { Solid<Bounded> solid =
new Solid<Bounded>(new BoundedO); solid.colorO; solid.getYO. solid.weightO;
}
} ///
ΠΠ΅ΡΠΎΡΡΠ½ΠΎ, Π²Ρ Π·Π°ΠΌΠ΅ΡΠΈΠ»ΠΈ, ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ BasicBounds.java ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΈΠ·Π±ΡΡΠΎΡΠ½ΠΎΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΡΠ°Π½Π΅Π½Π° ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ. Π‘ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΡΡΠΎΠ²Π½Π΅ΠΌ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ:
II: generics/InheritBounds.java
class HoldItem<T> { T item;
HoldItem(T item) { this.item = item; } T getltemO { return item; }
}
class Colored2<T extends HasColor> extends HoldItem<T> {
Colored2(T item) { super(item). }
java awt Color col or Π { return item.getColorO; }
}
class ColoredDimension2<T extends Dimension & HasColor> extends Colored2<T> {
ColoredDimension2(T item) { super(item); } int getXO { return item x; } int getYO { return item.y, } int getZO { return item z; }
}
class Solid2<T extends Dimension & HasColor & Weight> extends ColoredDimension2<T> {
Solid2(T item) { super(item); } int weight Π { return item.weightO; }
}
public class InheritBounds {
public static void main(String[] args) { Solid2<Bounded> solid2 =
new Solid2<Bounded>(new BoundedO); solid2 colorO: solid2 getYO; solid2 weightO,
}
} ///.-
Holdltem ΠΏΡΠΎΡΡΠΎ Ρ ΡΠ°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡ; ΡΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ ΠΊΠ»Π°ΡΡΠΎΠΌ Colored2, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ΅Π±ΡΠ΅Ρ, ΡΡΠΎΠ±Ρ Π΅Π³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°Π» HasColor. ColoredDi-mension2 ΠΈ Solid2 ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ Π½ΠΎΠ²ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ. Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ Π½Π°ΡΠ»Π΅Π΄ΡΡΡΡΡ, ΠΈ ΠΈΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ²ΡΠΎΡΡΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅.
ΠΡΠΈΠΌΠ΅Ρ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ΠΉ:
//: generics/EpicBattlΠ΅.java // Demonstrating bounds in Java generics, import java util.*;
interface Superpower {} interface XRayVision extends Superpower { void seeThroughWallsO;
}
interface SuperHearing extends Superpower { void hearSubtleNoisesO;
}
interface SuperSmell extends Superpower { void trackBySmellO;
}
class SuperHero<POWER extends SuperPower> { POWER power;
SuperHero(POWER power) { this.power = power; } POWER getPower0 { return power; }
}
class SuperSleuth<POWER extends XRayVision>
extends SuperHero<POWER> {
SuperSleuth(POWER power) { super(power); } void see() { power. seeThroughWallsO: }
}
class CanineHero<POWER extends SuperHearing & SuperSmell> extends SuperHero<POWER> {
CanineHero(POWER power) { super(power); } void hearO { power.hearSubtleNoisesO; } void smell Π { power.trackBySmell0; }
}
class SuperHearSmell implements SuperHearing, SuperSmell { public void hearSubtleNoisesO {} public void trackBySmell0 {}
}
class DogBoy extends CanineHero<SuperHearSmell> { DogBoyO { super(new SuperHearSmell0); }
}
public class EpicBattle {
// ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°Ρ : static <POWER extends SuperHearing> void useSuperHearing(SuperHero<POWER> hero) { hero, get Power () hearSubtleNoisesO:
}
static <POWER extends SuperHearing & SuperSmell> void superFind(SuperHero<POWER> hero) {
hero, get Power 0 .hearSubtleNoisesO; hero.getPower() .trackBySmel 10;
}
public static void main(String[] args) { DogBoy dogBoy = new DogBoyO; useSuperHearing(dogBoy); superFind(dogBoy); // Π’Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ:
List<? extends SuperHearing> audioBoys; // Π ΡΠ°ΠΊ Π½Π΅Π»ΡΠ·Ρ:
// List<? extends SuperHearing & SuperSmell> dogBoys;
}
} ///:-
ΠΠ΅ΡΠ°ΡΠΈΠΌΠ²ΠΎΠ»Ρ
ΠΡ ΡΠΆΠ΅ Π²ΡΡΡΠ΅ΡΠ°Π»ΠΈ ΠΏΡΠΎΡΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ΅ΡΠ°ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² β Π²ΠΎΠΏΡΠΎΡΠΈΡΠ΅Π»ΡΠ½ΡΡ Π·Π½Π°ΠΊΠΎΠ² Π² Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ β Π² Π³Π»Π°Π²Π°Ρ Π ΠΈ 13. Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΡΠ΅ΠΌΠ° Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ.
ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°, Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΎΠ΄Π½Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ²: ΠΌΠ°ΡΡΠΈΠ² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ ΡΡΡΠ»ΠΊΠ΅ Π½Π° ΠΌΠ°ΡΡΠΈΠ² Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°:
II: generics/CovariantArrays.java class Fruit {}
class Apple extends Fruit {}
class Jonathan extends Apple {} class Orange extends Fruit {}
public class CovariantArrays {
public static void main(String[] args) { Fruit[] fruit = new Apple[10]; fruit[0] = new AppleO; // OK fruit[l] = new JonathanO; // OK
// Π’ΠΈΠΏ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ - Applet], Π° Π½Π΅ Fruit[] ΠΈΠ»ΠΈ Orange[]: try {
// ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Fruit: fruit[0] = new FruitO; // ArrayStoreException } catch(Exception e) { System.out.println(e): } try {
// ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Orange: fruit[0] = new OrangeO; // ArrayStoreException } catch(Exception e) { System.out.println(e); }
}
} /* Output:
java.1ang.ArrayStoreException: Fruit java.1ang.ArrayStoreExcepti on: Orange *///:-
ΠΠ΅ΡΠ²Π°Ρ ΡΡΡΠΎΠΊΠ° main() ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΌΠ°ΡΡΠΈΠ² Apple ΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅Ρ Π΅Π³ΠΎ ΡΡΡΠ»ΠΊΠ΅ Π½Π° ΠΌΠ°ΡΡΠΈΠ² Fruit. ΠΡΠ³Π»ΡΠ΄ΠΈΡ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ β Apple ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡΡΡ Fruit, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠ°ΡΡΠΈΠ² Apple ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ Fruit.
Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠΈΠΏΠΎΠΌ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΡΡ1Π΅[], Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ Apple ΠΈΠ»ΠΈ ΡΡΠ±ΡΠΈΠΏ Apple, ΠΏΡΠΈΡΠ΅ΠΌ ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ±Π»ΡΠ΄Π°ΡΡΡΡ ΠΊΠ°ΠΊ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, ΡΠ°ΠΊ ΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΡΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ ΡΡΡΠ»ΠΊΡ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ Fruit. ΠΠ»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° ΡΡΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ Π΄Π΅Π»ΠΎ ΡΠΎ ΡΡΡΠ»ΠΊΠΎΠΉ Fruit[] β ΡΠ°ΠΊ ΠΏΠΎΡΠ΅ΠΌΡ Π±Ρ Π½Π΅ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ Π·Π°Π½Π΅ΡΡΠΈ Π² ΠΌΠ°ΡΡΠΈΠ² ΠΎΠ±ΡΠ΅ΠΊΡ Fruit ΠΈΠ»ΠΈ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ Fruit, β ΡΠΊΠ°ΠΆΠ΅ΠΌ, Orange? ΠΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΡΡΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π½Π°Π΅Ρ, ΡΡΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ Π΄Π΅Π»ΠΎ Ρ Apple [], ΠΈ ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ Π·Π°Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΡΠΎΡΠΎΠ½Π½Π΅Π³ΠΎ ΡΠΈΠΏΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅.
ΠΠΏΡΠΎΡΠ΅ΠΌ, Π΄Π»Ρ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² ΡΡΠΎ Π½Π΅ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΡΠΎΠ±ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΡΠΈ Π²ΡΡΠ°Π²ΠΊΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π΅Π²Π΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π²Ρ ΠΎΠ± ΡΡΠΎΠΌ ΠΎΡΠ΅Π½Ρ Π±ΡΡΡΡΠΎ ΡΠ·Π½Π°Π΅ΡΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΠ΅Π»Π΅ΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ°ΠΊ ΡΠ°Π· ΠΈ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ Π²ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ Π½Π° ΡΡΠ°Π΄ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡΠ°ΠΊ, ΡΡΠΎ ΠΆΠ΅ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Π²ΠΌΠ΅ΡΡΠΎ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ²?
//: generics/NonCovariantGenerics.java // {CompileTimeError} (Won't compile) import java.util.*:
public class NonCovariantGenerics {