2013-05-27 3 views
1

Это не вопрос, как это сделать. Речь идет о , почему так оно и есть.java массивы параметрических типов

Массивы в Java знают свой тип компонента во время выполнения, и из-за стирания типа мы не можем иметь объекты массива переменных общего типа. Допускаются типы массивов с использованием дженериков и проверяются на чтение/запись звука, единственной проблемой, по-видимому, являются выражения распределителя.

Обратите внимание, что компилятор Java также запрещает следующее:

Pong<Integer> lotsofpong [] = new Pong<Integer>[100]; 

... где Pong просто любой старый параметрический класс. Здесь нет ничего неизвестного. Да, во время выполнения lotsofpong будет просто массивом Pong, но я не вижу причины, по которой компилятор не может запомнить параметр типа для целей компиляции. Ну, это на самом деле это помнит, потому что эти типы существуют во время компиляции, поэтому единственной проблемой является отказ предоставить распределителю во время компиляции определенный тип компонента, связанный с общим параметром.

Даже если параметр Pong является переменной общего типа, которая также не должна иметь значения. Динамический массив все равно будет массивом Pong, требуя для каждого элемента размер Pong, который не зависит от его параметра типа.

Да, я знаю, что есть способы обойти это: либо использовать отливки (возможно, с SuppressWarning) из непараметрического типа, либо подкласс Pong<Integer> с непараметрическим классом и вместо этого использовать этот тип. Но есть ли причина, почему такой распределитель не разрешен?

+0

http://stackoverflow.com/questions/9542076/array-of-parameterized-types, http://stackoverflow.com/questions/529085/java-how-to-generic-array-creation и http: //www.ibm.com/developerworks/java/library/j-jtp01255/index.html может представлять интерес. – jedwards

+1

Эффективный элемент java 25. Я действительно не помню его, но вы можете попробовать эту ссылку [google books] (http://books.google.com/books?id=ka2VUBqHiWkC&pg=PA119&lpg=PA119&dq=effective+java+generic + массив и источник = бл & отс = yYIoOin1VY & сиг = OLgj07rc_1YGLtguS2E1slt2iDc & гл = еп & са = Х & е = Kw6jUZDUCbTV4ASajIGIAw & вед = 0CC4Q6AEwAA # v = OnePage & д = эффективная% 20java% 20generic% 20array & F = ложь) – zeller

ответ

1

Основано на ссылке, предоставленной Zeller (на основе Josh Bloch - «Эффективная Java-книга»).

Массивы не являются безопасными, так как следующий код компилируется:

String strings [] = {"Foo"}; 
Object objects [] = strings; 
objects[0] = 1; 

Вы получите специальное исключение в время выполнения: java.lang.ArrayStoreException. Java во время выполнения во время выполнения, в который вы помещаете соответствующий тип в массив.

Назначение массива массиву его супер-типа называется «Ковариация».

Общие характеристики гарантируются на уровне время компиляции.

Если фрагмент кода, который вы упомянули в вопросе мог быть составлен, следующий код будет также компилирует:

Pong<Integer> integerPongs [] = new Pong<Integer>[100]; 
Object objectPongs [] = integerPongs; 
objectPongs[0] = new Pong<String>(); 
Pong<Integer> stringPong = integerPongs[0]; // ClassCastException 

Наш код становится не безопасным поэтому было запрещено спецификацией.

Причина, по которой:

objectPongs[0] = new Pong<String>(); 

не бросает java.lang.ArrayStoreException потому, что время выполнения тип каждого экземпляра Pong Pong всегда так дженериков является время компиляции механизм ,

Смежные вопросы