Философия Java3
вернуться

Эккель Брюс

Шрифт:

Механизм автоматической упаковки работает с инициализаторами массивов:

//• 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.

Такая конструкция проходит проверку без малейших возражений со стороны компилятора. И хотя вы не можете создать объект массива с параметризацией, можно создать объект непараметризованного типа и преобразовать его:

  • Читать дальше
  • 1
  • ...
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • ...

Private-Bookers - русскоязычная библиотека для чтения онлайн. Здесь удобно открывать книги с телефона и ПК, возвращаться к сохраненной странице и держать любимые произведения под рукой. Материалы добавляются пользователями; если считаете, что ваши права нарушены, воспользуйтесь формой обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • help@private-bookers.win

Подпишитесь на рассылку: