Вход/Регистрация
Философия Java3
вернуться

Эккель Брюс

Шрифт:

//: generics/BasicGeneratorDemo java i mport net.mi ndvi ew.uti1.*.

public class BasicGeneratorDemo {

public static void main(String[] args) { Generator<CountedObject> gen =

BasicGenerator create(CountedObject.class), for(int i = 0; i < 5; i++)

System, out pri ntl n(gen. nextO);

}

} /* Output CountedObject 0 CountedObject 1 CountedObject 2 CountedObject 3 CountedObject 4 */// ~

Как видите, применение параметризованного метода снижает объем кода, необходимого для получения объекта Generator. Раз уж механизм параметризации Java все равно заставляет вас передавать объект Class, его можно заодно использовать для вычисления типа в методе create.

Упрощение работы с кортежами

Используя вычисление аргументов типов в сочетании со static-импортом, можно оформить приведенную ранее реализацию кортежей в более универсальную библиотеку. В следующем примере кортежи создаются перегруженным статическим методом:

//• net/mi ndvi ew/uti1/Tuple.java // Библиотека для работы с кортежами // с использованием вычисления аргументов типов package net mindview.util,

public class Tuple {

public static <A,B> TwoTuple<A,B> tuple(A а. В b) { return new TwoTuple<A,B>(a, b).

}

public static <A,B,C> ThreeTuple<A,B,C> tuple(A а. В b. С с) {

return new ThreeTuple<A,B,C>(a, b, c):

}

public static <A,B,C.D> FourTuple<A,B,C.D> tuple(A а. В b. С с. D d) {

return new FourTuple<A,B.C.D>(a. b. c. d).

}

public static <A,B,C.D,E>

FiveTuple<A,B,C,D,E> tuple(A а. В b, С с, D d. E e) {

return new FiveTuple<A,B,C.D,E>(a, b. c. d. e);

}

} ///:-

А вот как выглядит обновленная версия TupleTest.java для тестирования Tuple.java:

//: generics/TupleTest2.java import net.mindview.util.*;

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

public class TupleTest2 {

static TwoTuple<String,Integer> f { return tupleChi", 47);

}

static TwoTuple f2 { return tupleC'hi", 47); } static ThreeTuple<Amphibian,String,Integer> g { return tuple(new AmphibianO, "hi", 47);

}

static

FourTuple<Vehicle,Amphibian,String,Integer> hO {

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.

  • Читать дальше
  • 1
  • ...
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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