Чтение онлайн

на главную

Жанры

Философия Java3

Эккель Брюс

Шрифт:

}

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++)

spheres[i] = new ArrayList<BerylliumSphere>;

}

} ///-

Мы видим, что при при получении ссылки на List<String>[] выполняется некоторая проверка на стадии компиляции. Проблема в том, что массивы ковари-антны, поэтому List<String>[] также является Object[], поэтому вашему массиву можно присвоить ArrayList<Integer> без выдачи ошибок на стадии компиляции или выполнения.

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

Создание тестовых данных

При

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

Arrays.fill

Класс Arrays из стандартной библиотеки Java содержит весьма тривиальный метод fill: он всего лишь дублирует одно значение в каждом элементе массива, а в случае объектов копирует одну ссылку в каждый элемент. Пример:

//• arrays/FillingArrays.java // Использование Arrays.fill О import java.util.*;

import static net.mindview.util.Print.*;

public class FillingArrays {

public static void main(String[] args) { int size = 6;

boolean[] al = new boolean[size];

byte[] a2 = new byte[size];

char[] a3 = new char[size];

short[] a4 = new short[size];

int[] a5 = new int[size];

long[] a6 = new long[size];

float[] a7 = new float[size];

doublet] a8 = new double[size];

String!] a9 = new String[size];

Arrays.fi11(al, true);

printC'al = " + Arrays.toString(al));

Arrays.fill(a2, (byte)ll);

print("a2 = " + Arrays.toString(a2));

Arrays.fill(аЗ, 'x');

print("a3 = " + Arrays toString(a3));

Arrays.fill(a4, (short)17);

print("a4 = " + Arrays.toString(a4));

Arrays.fill(a5, 19);

print("a5 = " + Arrays.toString(a5));

Arrays.fill(a6, 23);

print("a6 = " + Arrays.toString(a6));

Arrays.fill(a7. 29);

print("a7 = " + Arrays toString(a7));

Arrays.fill(a8, 47);

print("a8 = " + Arrays.toString(a8));

Arrays.fill(a9. "Hello");

print("a9 = " + Arrays.toString(a9)).

// Интервальные операции:

Arrays.fill(a9. 3. 5, "World");

print("a9 = " + Arrays.toString(a9));

}

} /* Output:

al = [true, true, true, true. true, true] a2 = [11. 11. 11. 11. 11. 11]

a3 = [x, x. x. x. x. x] продолжение &

а4 = [17. 17. 17. 17. 17. 17] а5 = [19. 19. 19. 19. 19. 19] аб = [23. 23. 23. 23. 23. 23] а7 = [29.0, 29.0. 29.0, 29.0. 29.0. 29.0] а8 = [47.0. 47.0, 47.0. 47.0. 47.0. 47.0] а9 = [Hello. Hello. Hello. Hello. Hello. Hello] a9 = [Hello. Hello. Hello. World, World. Hello] *///:-

Метод заполняет* либо весь массив, либо, как показывают две последние команды, диапазон его элементов. Но, поскольку вызывать Arrays.fill можно только для одного значения данных, полученные результаты не слишком полезны.

Генераторы данных

Чтобы создавать менее тривиальные массивы данных с более гибкими возможностями, мы воспользуемся концепцией генераторов, представленной в главе 14. Генератор способен выдавать любые данные по вашему выбору (напомню, что он является примером паттерна «стратегия» — разные генераторы представляют разные стратегии).

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

70 Рублей

Кожевников Павел
1. 70 Рублей
Фантастика:
фэнтези
боевая фантастика
попаданцы
постапокалипсис
6.00
рейтинг книги
70 Рублей

Жатва душ. Остров мертвых

Сугралинов Данияр
Фантастика:
боевая фантастика
рпг
5.20
рейтинг книги
Жатва душ. Остров мертвых

Сердце Дракона. Том 9

Клеванский Кирилл Сергеевич
9. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.69
рейтинг книги
Сердце Дракона. Том 9

Как я строил магическую империю 6

Зубов Константин
6. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 6

Леди для короля. Оборотная сторона короны

Воронцова Александра
3. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Леди для короля. Оборотная сторона короны

Кодекс Крови. Книга VI

Борзых М.
6. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VI

Газлайтер. Том 4

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4

АллатРа

Новых Анастасия
Научно-образовательная:
психология
история
философия
обществознание
физика
6.25
рейтинг книги
АллатРа

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Дорога к счастью

Меллер Юлия Викторовна
Любовные романы:
любовно-фантастические романы
6.11
рейтинг книги
Дорога к счастью

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая

Николай I Освободитель. Книга 2

Савинков Андрей Николаевич
2. Николай I
Фантастика:
героическая фантастика
альтернативная история
5.00
рейтинг книги
Николай I Освободитель. Книга 2

Секретарша генерального

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
8.46
рейтинг книги
Секретарша генерального