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

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

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

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 {