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

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

return tuple(new VehicleO, new AmphibianO, "hi", 47);

}

static

FiveTuple<Vehicle,Amphibian.String,Integer,Double> к О { return tuple(new VehicleO, new AmphibianO, "hi", 47, 11.1);

}

public static void main(String[] args) {

TwoTuple<String,Integer> ttsi = f; System out.println(ttsi): System.out.println(f20); System.out.println(gO); System.out println(hO); System.out.println(kO);

}

} /* Output (hi, 47) (hi, 47)

(Amphibian@7d772e, hi, 47) (Vehicle@757aef, Amphibian@d9f9c3, hi. 47) (Vehicle@la46e30, Amphibian@3e25a5. hi. 47, 11.1) *///:-

Обратите

внимание: f возвращает параметризованный объект TwoTuple, a f2 — ^параметризованный объект TwoTuple. Компилятор в данном случае не выдает предупреждения о f2, потому что возвращаемое значение не используется в «параметризованном» стиле: в каком-то смысле проводится «восходящее преобразование» его до непараметризованного TwoTuple. Но, если попытаться сохранить результат f2 в параметризованном объекте TwoTuple, компилятор выдаст предупреждение.

Вспомогательный класс Set

Рассмотрим еще один пример использования параметризованных методов: математические операции между множествами. Эти операции удобно определить в виде параметризованных методов, используемых с различными типами:

//: net/mi ndvi ew/uti1/Sets.java package net.mindview.util; import java.util.*;

public class Sets {

public static <T> Set<T> union(Set<T> a, Set<T> b) { Set<T> result = new HashSet<T>(a);

result.addAl1(b). return result;

}

public static <T>

Set<T> intersection(Set<T> a. Set<T> b) { Set<T> result = new HashSet<T>(a). result retainAll(b); return result;

}

// Вычитание подмножества из надмножества-public static <T> Set<T> difference(Set<T> superset. Set<T> subset) {

Set<T> result = new HashSet<T>(superset); result.removeAll(subset). return result;

}

// Дополнение -- все. что не входит в пересечение public static <T> Set<T> complement(Set<T> a, Set<T> b) {

return difference(union(a. b). intersection^, b));

}

} ///:-

Первые три метода дублируют первый аргумент, копируя его ссылки в новый объект HashSet, поэтому аргументы Set не изменяются напрямую. Таким образом, возвращаемое значение представляет собой новый объект Set.

Четыре метода представляют математические операции с множествами: union возвращает объект Set, полученный объединением множеств-аргументов, intersection возвращает объект Set с общими элементами аргументов, difference вычисляет разность множеств, a complement) — объект Set со всеми элементами, не входящими в пересечение. Чтобы создать простой пример использования этих методов, мы воспользуемся перечислением, содержащим разные названия акварельных красок:

//: generics/watercolors/Watercolors java package generics.watercolors;

public enum Watercolors {

ZINC. LEM0N_YELL0W. MEDIUM_YELLOW, DEEP_YELLOW, ORANGE. BRILLIANT_RED. CRIMSON. MAGENTA. ROSE_MADDER. VIOLET. CERULEAN_BLUE_HUE. PHTHALO_BLUE, ULTRAMARINE. COBALT_BLUE_HUE, PERMANENT_GREEN. VIRIDIAN_HUE. SAP_GREEN. YELL0W_0CHRE. BURNT_SIENNA. RAWJJMBER, BURNTJJMBER. PAYNES_GRAY. IVORY_BLACK } ///:-

Для

удобства (чтобы избежать уточнения всех имен) в следующем примере это перечисление импортируется статически. Мы используем EnumSet — новый инструмент Java SE5 для простого создания Set на базе перечисления. Статическому методу EnumSet.range передаются первый и последний элементы диапазона, по которому строится множество:

II: generics/WatercolorSets.java import generics.watercolors.*; import java.util.*;

import static net.mindview.util.Print.*; продолжение &

import static net.mindview util.Sets *; import static generics.watercolors.Watercolors.*;

public class WatercolorSets {

public static void main(String[] args) { Set<Watercolors> setl =

EnumSet.range(BRILLIANT_RED, VIRIDIAN_HUE); Set<Watercolors> set2 =

EnumSet range(CERULEAN_BLUE_HUE, BURNT_UMBER), printCsetl. " + setl); print("set2- " + set2);

print("union(setl. set2)- " + union(setl. set2)); Set<Watercolors> subset = intersection(setl. set2); print("intersection(setl. set2). " + subset). print("difference(setl. subset)- " +

difference(setl. subset)). print("difference(set2. subset). " +

difference(set2. subset)); print("complement(setl. set2) " + complement(setl. set2));

}

} /* Output.

setl. [BRILLIANT_RED. CRIMSON. MAGENTA. ROSE_MADDER, VIOLET. CERULEAN_BLUE_HUE. PHTHALO_BLUE. ULTRAMARINE. COBALT_BLUE_HUE. PERMANENT_GREEN. VIRIDIAN_HUE] set2- [CERULEAN_BLUE_HUE, PHTHALO_BLUE. ULTRAMARINE. COBALT_BLUE_HUE. PERMANENT_GREEN. VIRIDIAN_HUE. SAP_GREEN. YELL0W_0CHRE. BURNT_SIENNA. RAWJJMBER. BURNT_UMBER] union(setl. set2) [SAP_GREEN. ROSE_MADDER, YELL0W_0CHRE. PERMANENT_GREEN. BURNTJJMBER, COBALT_BLUE_HUE, VIOLET. BRILLIANT_RED. RAWJJMBER. ULTRAMARINE. BURNT_SIENNA. CRIMSON. CERULEAN_BLUE_HUE. PHTHALO_BLUE. MAGENTA. VIRIDIAN_HUE]

intersection(setl. set2): [ULTRAMARINE. PERMANENT_GREEN. COBALT_BLUE_HUE. PHTHALO_BLUE. CERULEAN_BLUE_HUE. VIRIDIAN_HUE]

difference(setl, subset): [ROSE_MADDER, CRIMSON. VIOLET. MAGENTA. BRILLIANT_RED] difference(set2. subset): [RAWJJMBER, SAP_GREEN. YELLOW J3CHRE, BURNT_SIENNA, BURNTJJMBER]

complement(setl, set2): [SAP_GREEN. ROSE_MADDER. YELL0W_0CHRE. BURNTJJMBER, VIOLET. BRILLIANT_RED, RAW_UMBER. BURNT_SIENNA. CRIMSON. MAGENTA] *///:-

В выходных данных показаны результаты выполнения каждой операции. В следующем примере представлены варианты вызова Sets.difference для разных классов Collection и Map из java.util:

//: net/mi ndvi ew/uti1/Contai nerMethodDi fferences.java package net.mindview.util; import java lang reflect *; import java.util.*,

public class ContainerMethodDifferences {

static Set<String> methodSet(Class<?> type) {

Set<String> result = new TreeSet<String>; for (Method m : type.getMethodsO) result.add(m.getNameO); return result;

}

static void interfaces(Class<?> type) {

System.out.print("Interfaces in " +

type getSimpleNameO + ": "); List<String> result = new ArrayList<String>;

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

Экспансия (сборник)

Басов Николай Владленович
Шедевры отечественной фантастики
Фантастика:
научная фантастика
5.00
рейтинг книги
Экспансия (сборник)

Барон меняет правила

Ренгач Евгений
2. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон меняет правила

Товарищ "Чума"

lanpirot
1. Товарищ "Чума"
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Товарищ Чума

Я уже царь. Книга XXIX

Дрейк Сириус
29. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я уже царь. Книга XXIX

Родовая магия

Layna
Проект «Поттер-Фанфикшн»
Фантастика:
фэнтези
5.00
рейтинг книги
Родовая магия

Том 4. Повести и рассказы, статьи 1844-1854

Тургенев Иван Сергеевич
4. Собрание сочинений в двенадцати томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 4. Повести и рассказы, статьи 1844-1854

Последний герой

Грэйдо Эллениэль и Эстель
2. Последний герой
Фантастика:
фэнтези
юмористическое фэнтези
6.60
рейтинг книги
Последний герой

Сотворение миров (сборник)

Ларионова Ольга Николаевна
Фантастика:
научная фантастика
5.00
рейтинг книги
Сотворение миров (сборник)

Кир Булычев. Собрание сочинений в 18 томах. Т.14

Булычев Кир
Собрания сочинений
Детские:
детская фантастика
6.25
рейтинг книги
Кир Булычев. Собрание сочинений в 18 томах. Т.14

Великая Охота (др. изд.)

Джордан Роберт
2. Колесо Времени
Фантастика:
фэнтези
6.83
рейтинг книги
Великая Охота (др. изд.)

Железная звезда

Силверберг Роберт
Шедевры фантастики
Фантастика:
фэнтези
научная фантастика
6.25
рейтинг книги
Железная звезда

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

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

История политических и правовых учений. Учебник

Коллектив авторов
Научно-образовательная:
история
юриспруденция
5.00
рейтинг книги
История политических и правовых учений. Учебник

Собрание военных повестей в одном томе

Быков Василий Владимирович
Проза:
военная проза
5.00
рейтинг книги
Собрание военных повестей в одном томе