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

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

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

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

invokevirtual #6; II ΠœΠ΅Ρ‚ΠΎΠ΄ set:(Object;)V

14

aload_l

15

invokevirtual #7; // ΠœΠ΅Ρ‚ΠΎΠ΄ get:OObject:

18

checkcast #8; // Класс java/lang/String

21

astore_2

22

return

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° set() выполняСтся компилятором «бСсплатно». ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ значСния get() ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ»ΠΎΡΡŒ, Π½ΠΎ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π²Π°ΠΌ Π½Π΅ приходится Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ β€” ΠΎΠ½ΠΎ автоматичСски вставляСтся компилятором.

ΠšΠΎΠΌΠΏΠ΅Π½ΡΠ°Ρ†ΠΈΡ Π·Π° стираниС

Как ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ стирания становится Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. ВсС, для Ρ‡Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° точная информация ΠΎ Ρ‚ΠΈΠΏΠ΅ Π²ΠΎ врСмя выполнСния, Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚:

//: generics/Erased.java // {CompileTimeError} (He компилируСтся)

public class Erased<T> {

private final int SIZE = 100: public static void f(Object arg) { if(arg instanceof T) {} T var = new TO; T[] array = new T[SIZE]; T[] array = (T)new Object[SIZE]

}

} Hi

ll Ошибка 11 Ошибка II Ошибка ; 11 ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅

Иногда Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ удаСтся ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅, Π½ΠΎ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… случаях стираниС приходится ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ посрСдством ввСдСния ΠΌΠ΅Ρ‚ΠΊΠΈ Ρ‚ΠΈΠΏΠ°. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π²Ρ‹ явно ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class для своСго Ρ‚ΠΈΠΏΠ°.

НапримСр, ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° использования instanceof Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ информация ΠΎ Ρ‚ΠΈΠΏΠ΅ Π±Ρ‹Π»Π° стСрта. ΠŸΡ€ΠΈ Π²Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΊΠΈ Ρ‚ΠΈΠΏΠ° вмСсто instanceof ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ динамичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ islnstance():

//: generics/ClassTypeCapture.java

class Building {}

class House extends Building {}

public class ClassTypeCapture<T> { Class<T> kind;

public ClassTypeCapture(Class<T> kind) { this.kind = kind;

}

public boolean f(Object arg) {

return kind.islnstance(arg);

}

public static void main(String[] args) { ClassTypeCapture<Building> cttl =

new CIassTypeCapture<Bui1di ng>(Bui 1di ng.class); System.out.pri nt1n(cttl.f(new Bui 1di ng())); System.out.pri ntin(cttl.f(new House())); ClassTypeCapture<House> ctt2 =

new ClassTypeCapture<House>(House.class); System.out.pri nt1n(ctt2.f(new Bui 1di ng())); System.out.pri nt1n(ctt2.f(new House()));

}

} /* Output; true true false true *///:-

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ слСдит Π·Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ΅Ρ‚ΠΊΠ° Ρ‚ΠΈΠΏΠ° соотвСтствовала ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠΌΡƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ экзСмпляров Ρ‚ΠΈΠΏΠΎΠ²

ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° создания newT() Π² Erased.java Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ отчасти ΠΈΠ·-Π·Π° стирания, Π° отчасти ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ компилятор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Ρƒ Π’ конструктора ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²). Но Π² Π‘++ эта опСрация СстСствСнна, прямолинСйна ΠΈ бСзопасна (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° выполняСтся Π²ΠΎ врСмя компиляции):

//; generics/InstantiateGenericType.java import static net.mindview.util.Print.*;

class ClassAsFactory<T> { T x;

public ClassAsFactory(Class<T> kind) {

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

Ρ… = kind.newInstanceO; } catch(Exception Π΅) {

throw new RuntimeException(e);

}

}

}

class Employee {}

public class InstantiateGenericType {

public static void main(String[] args) { ClassAsFactory<Employee> fe =

new ClassAsFactory<Employee>(Employee.class); pri nt("ClassAsFactory<Employee> успСх"); try {

ClassAsFactory<Integer> fi =

new ClassAsFactory<Integer>(Integer.class); } catch(Exception e) {

print("ClassAsFactory<Integer> Π½Π΅ΡƒΠ΄Π°Ρ‡Π°");

}

}

} /* Output:

ClassAsFactory<Employee> успСх ClassAsFactory<Integer> Π½Π΅ΡƒΠ΄Π°Ρ‡Π° *///:-

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° компилируСтся, Π½ΠΎ с ClassAsFactory<Integer> происходит сбой, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Integer Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ конструктора ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Ошибка Π½Π΅ обнаруТиваСтся Π²ΠΎ врСмя компиляции, поэтому спСциалисты ΠΈΠ· Sun ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ. ВмСсто этого рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ²Π½ΡƒΡŽ Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ принимался Ρ‚ΠΎΠ»ΡŒΠΊΠΎ класс, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ эту Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ:

//: generics/FactoryConstraint.java

interface FactoryI<T> { T createO;

}

class Foo2<T> { private T x:

public <F extends FactoryI<T>> Foo2(F factory) { x = factory. createO;

}

// ...

class IntegerFactory implements FactoryI<Integer> { public Integer createO {

return new Integer(O):

}

}

class Widget {

public static class Factory implements FactoryI<Widget> public Widget createO {

return new Widget О:

public class FactoryConstraint {

public static void main(String[] args) {

new Foo2<Integer>(new IntegerFactoryO); new Foo2<Widget>(new Widget.FactoryO);

}

} ///:-

Π’ сущности, это всСго лишь Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Class<T>. Π’ ΠΎΠ±ΠΎΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ„Π°Π±Ρ€ΠΈΠΊ; просто Π² случаС с Class<T> ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ оказываСтся встроСнным, Π° ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΎΠ½ создаСтся явно. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π² ΠΎΠ±ΠΎΠΈΡ… случаях рСализуСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции.

Π”Ρ€ΡƒΠ³ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ основано Π½Π° использовании ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Β«ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄Β». Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ get() β€” ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, a create() опрСдСляСтся Π² субклассС для получСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° этого Ρ‚ΠΈΠΏΠ°:

//: generics/CreatorGeneriс.java

abstract class GenericWithCreate<T> { final T element;

GenericWithCreateO { element = createO; } abstract T createO;

}

class X {}

class Creator extends GenericWithCreate<X> { X createO { return new XO; } void fO {

System.out.pri nt 1 n(el ement.getClass().getSi mpleName()),

}

}

public class CreatorGeneric {

public static void main(String[] args) { Creator с = new CreatorO: C.fO;

}

} /* Output: X

*///:-

ΠœΠ°ΡΡΠΈΠ²Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²

Как ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² Erased.java, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ массивы ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² нСльзя. Π’Π΅Π·Π΄Π΅, Π³Π΄Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² создании Ρ‚Π°ΠΊΠΈΡ… массивов, слСдуСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ArrayList:

//: generics/Li stOfGeneri cs.java import java.util.*;

public class ListOfGenerics<T> {

private List<T> array = new ArrayList<T>();

public void add(T item) { array.add(item); } public T get(int index) { return array.get(index); } } ///:-

ΠŸΡ€ΠΈ этом Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ массивов с Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ‚ΠΈΠΏΠΎΠ² Π½Π° стадии компиляции, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΈΠ½ΠΎΠ³Π΄Π° Π±Ρ‹Π²Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ массив ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² (скаТСм, Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ArrayList ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ массивы). ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ссылку Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ протСсты компилятора. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

II: tjenerics/ArrayOfGenericReference.java class Generic<T> {}

public class ArrayOfGenericReference { static Generic<Integer>[] gia:

} ///

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ эту запись Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π²Ρ‹ Π½Π΅ смоТСтС ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ массив ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ°), поэтому всС это сбиваСт с Ρ‚ΠΎΠ»ΠΊΡƒ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС массивы ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ структурой (Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΈ способ размСщСния Π² памяти) нСзависимо ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° хранящихся Π΄Π°Π½Π½Ρ‹Ρ…, создаСтся Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ смоТСтС ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ массив Object ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊ Π½ΡƒΠΆΠ½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ. Код ΠΎΡ‚ΠΊΠΎΠΌ-пилируСтся, Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ β€” ΠΎΠ½ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ClassCastException:

II: generics/ArrayOfGeneriс.java

public class ArrayOfGeneriс {

static final int SIZE = 100, static Generic<Integer>[] gia; @SuppressWarni ngs("unchecked") public static void main(String[] args) {

// ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ, Π½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ClassCastException:

//! gia = (Generic<Integer>[])new Object[SIZE];

II Π’ΠΈΠΏ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния являСтся "стСртым" type:

gia = (Generic<Integer>[])new Generic[SIZE];

System.out.pri ntin(gi a.getClass().getSi mpleName());

gia[0] = new Generic<Integer>();

//! gia[l] = new ObjectO; II Ошибка компиляции

II ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ΡΡ нСсоотвСтствиС Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΎ врСмя компиляции:

//! gia[2] = new Generic<DoublΠ΅>();

}

} /* Output:

Generic[]

*///:-

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ массивы ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ свой фактичСский Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ задаСтся Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ создания массива. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π΄Π°ΠΆΠ΅ нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ gia прСобразуСтся Π² Generic<Integer>[], эта информация сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° стадии компиляции (Π° Π±Π΅Π· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ @SuppressWarnings Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅). Π’ΠΎ врСмя выполнСния ΠΌΡ‹ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ с массивом Object, ΠΈ это создаСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. УспСшно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ массив ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ способом β€” ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ массив «стСртого» Ρ‚ΠΈΠΏΠ° ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅.

Рассмотрим Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТный ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Допустим, имССтся простая парамСтризованная Β«ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ°Β» для массива:

//: generics/GenericArray java

public class GenericArray<T> { private T[] array; @SuppressWarnings("unchecked") public GenericArray(int sz) {

array = (T[])new Object[sz];

}

public void put(int index, T item) { array[index] = item;

}

public T get(int index) { return array[index]; } // ΠœΠ΅Ρ‚ΠΎΠ΄, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ доступ ΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡƒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ: public T[] rep() { return array; } public static void main(String[] args) { GenericArray<Integer> gai =

new GenericArray<Integer>(10); // ΠŸΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ClassCastException: //! Integer[] ia = gai.rep(): // А Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ. Object[] oa = gai.rep();

}

} ///:-

Как ΠΈ ΠΏΡ€Π΅ΠΆΠ΄Π΅, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ запись Π’[] array = new T[sz], поэтому ΠΌΡ‹ создаСм массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ.

ΠœΠ΅Ρ‚ΠΎΠ΄ Π³Π΅Ρ€() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π’[]; Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ main() для gai это Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΈΠΏ Integerf], Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π²Ρ‹Π·ΠΎΠ²Π° ΠΈ сохранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΏΠΎ ссылкС Π½Π° Integer[] Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ClassCastException β€” это снова происходит ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ фактичСским Ρ‚ΠΈΠΏΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния являСтся Object[]. Если ΠΌΡ‹ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ Π’[], Ρ‚ΠΎ Π½Π° стадии компиляции фактичСский Ρ‚ΠΈΠΏ массива тСряСтся ΠΈ компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ошибки. Из-Π·Π° этого Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Object[], Π° Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ Π’ ΠΏΡ€ΠΈ использовании элСмСнта массива. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ GenericArray.java:

//: generics/GenericArray2.java

public class GenericArray2<T> { private Object[] array; public GenericArray2(int sz) { array = new Object[sz];

}

public void put(int index, T item) { array[index] = item;

}

@SuppressWarnings("unchecked")

public T get(int index) { return (T)array[index]; }

@SuppressWarnings("unchecked")

public T[] rep О { ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ &

return (T[])array; // ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: Π½Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅

}

public static void main(String[] args) { GenericArray2<Integer> gai =

new GenericArray2<Integer>(10); for(int i = 0: i < 10: i ++)

gai.put(i, i): for(int i = 0: i < 10; i ++)

System.out.print(gai.get(i) + " "); System.out.printlnO; try {

Integer[] ia = gai.rep(); } catch(Exception e) { System.out.printin(e); }