Философия Java3
Шрифт:
new Beryl li umSphereO. new Beryl liumSphereO , new BerylliumSphereO, new Beryl 1iumSphere. new Beryl liumSphereO. new Beryl liumSphereO }.
}:
System out.printin(Arrays.deepToStri ng(spheres));
}
} /* Output:
[[Sphere 0. Sphere 1]. [Sphere 2, Sphere 3. Sphere 4, Sphere 5]. [Sphere 6. Sphere 7. Sphere 8. Sphere 9. Sphere 10. Sphere 11. Sphere 12. Sphere 13]] *///:-
Массив spheres также является ступенчатым, то есть длины вложенных списков объектов различаются.
Механизм автоматической упаковки работает с инициализаторами массивов:
//• arrays/AutoboxingArrays.java import java util *.
public class AutoboxingArrays {
public static void main(String[] args) {
Integer[][] a = { //
{ 1, 2. 3. 4, 5, 6. 7. 8, 9, 10 }, продолжение #
{ 21. 22, 23, 24, 25, 26. 27. 28. 29. 30 }. { 51. 52. 53. 54, 55. 56. 57. 58. 59. 60 }. { 71. 72. 73. 74, 75. 76. 77. 78. 79. 80 }.
}.
System.out.pri ntlл(Arrays.deepToStri ng(a));
}
} /* Output-
[[1. 2, 3. 4. 5. 6. 7. 8. 9. 10]. [21. 22. 23. 24. 25. 26. 27. 28. 29. 30]. [51. 52. 53.
54. 55. 56. 57. 58. 59, 60], [71, 72, 73, 74. 75. 76. 77. 78. 79. 80]] *///-
А вот как происходит поэлементное построение массива не-примитивных объектов:
//. arrays/AssemblingMultidimensionalArrays.java // Создание многомерных массивов import java util.*;
public class AssemblingMultidimensionalArrays { public static void main(String[] args) { Integer[][] a. a = new Integer[3][]; for(int i = 0; i < a.length; i++) { a[i] = new Integer[3], for(int j = 0; j < a[i] length; j++)
a[i][j] = i * j; // Автоматическая упаковка
}
System.out println(Arrays.deepToString(a));
}
} /* Output.
[[0, 0, 0]. [0. 1. 2]. [0. 2. 4]] *///:-
Выражение i*j присутствует только для того, чтобы поместить менее тривиальное значение в Integer.
Метод Arrays.deepToString работает как с массивами примитивных типов, так и с массивами объектов:
//: arrays/MultiDimWrapperArray.java // Multidimensional arrays of "wrapper" objects, import java util *;
public class MultiDimWrapperArray {
public static void main(Str*ing[] args) {
Integer[][] al = { // Автоматическая упаковка { 1. 2. 3. }. { 4. 5. 6, }.
}.
Double[][][] a2 = { // Автоматическая упаковка { { 1.1. 2 2 }. { 3 3. 4.4 } }. { { 5.5, 6.6 }. { 7.7, 8 8}}, { { 9.9, 1 2 }. { 2.3, 3 4}},
}.
string:::: аз = {
{ "The", "Quick", "Sly", "Fox" }, { "Jumped". "Over" }.
{ "The". "Lazy". "Brown", "Dog", "and", "friend" },
System.out.printiл("al: " + Arrays.deepToString(al)): System.out.printiл("a2: " + Arrays.deepToString(a2)): System.out.printin("a3: " + Arrays.deepToString(a3)):
}
} /* Output:
al: [[1. 2. 3], [4. 5. 6]]
a2: [[[1.1. 2.2], [3.3. 4.4]]. [[5.5. 6.6], [7.7. 8.8]]. [[9.9. 1.2]. [2.3. 3.4]]] a3: [[The, Quick. Sly. Fox], [Jumped, Over], [The. Lazy. Brown. Dog. and. friend]] *///:-
И снова в массивах Integer и Double механизм автоматической упаковки Java SE5 создает необходимые объекты-«обертки».
Массивы и параметризация
В общем случае
массивы и параметризация плохо сочетаются друг с другом. Например, массивы не могут инициализироваться параметризованными типами:Peel<Banana>[] peels = new Peel<Banana>[10]: II He разрешено
Стирание удаляет информацию о параметре типа, а массив должен знать точный тип хранящихся в нем объектов для обеспечения безопасности типов. Впрочем, параметризовать можно сам тип массива:
//: arrays/ParameterizedArrayType.java
class ClassParameter<T> {
public T[] f(T[] arg) { return arg: }
}
class MethodParameter {
public static <T> T[] f(T[] arg) { return arg; }
}
public class ParameterizedArrayType {
public static void main(String[] args) {
Integer[] ints = { 1. 2. 3. 4. 5 }; Double[] doubles = { 1.1. 2.2. 3.3. 4.4'. 5.5 }; Integer[] ints2 =
new CIassParameter<Integer>.f(ints); Double[] doubles2 =
new ClassParameter<Double>.f(doubles); ints2 = MethodParameter.f(ints); doubles2 = MethodParameter.f(doubles);
}
} ///:-
Обратите внимание, как удобно использовать параметризованный метод вместо параметризованного класса: вам не придется создавать очередную «версию» класса с параметром для каждого типа, к которому он применяется, и его можно сделать static. Конечно, параметризованный класс не всегда можно заменить параметризованным методом, но такое решение может оказаться предпочтительным.
Как выясняется, не совсем правильно говорить, что вы не можете создавать массивы параметризованных типов. Действительно, компилятор не позволит создать экземпляр массива параметризованного типа, но вы можете создать ссылку на такой массив. Пример:
List<String>[] Is.
Такая конструкция проходит проверку без малейших возражений со стороны компилятора. И хотя вы не можете создать объект массива с параметризацией, можно создать объект непараметризованного типа и преобразовать его:
//• arrays/ArrayOfGenerics java
// Возможность создания массивов параметризованных типов
import java util *,
public class ArrayOfGenerics {
(PSuppressWarni ngs ("unchecked") public static void main(String[] args) { List<String>[] Is; List[] la = new List[10], Is = (List<String>[])la; // Предупреждение о
// непроверенном преобразовании 1sСОЛ = new ArrayList<String>. // Приводит к ошибке на стадии компиляции //! ls[l] = new ArrayList<Integer>;
// Проблема List<String> является подтипом Object Object[] objects = Is. // Поэтому присваивание возможно // Компилируется и выполняется без ошибок и предупреждений objects[l] = new ArrayList<Integer>.
// Но если ваши потребности достаточно элементарны. II создать массив параметризованных типов можно, хотя // и с предупреждением о "непроверенном" преобразовании-List<BerylliumSphere>[] spheres =
(List<Beryl1iumSphere>[])new List[10]. for(int i = 0; i < spheres length; i++)