Читаем Философия Java3 полностью

public class SuperTypeWiIdcards {

static void writeTo(List apples) { apples add(new AppleO), apples add(new JonathanO); // apples.add(new FruitO); // Ошибка

}

} /// ~

Аргумент apples является контейнером List для некоторого типа, являющегося базовым для Apple; из этого следует, что Apple и производные от Apple типы могут безопасно включаться в контейнер. Но, поскольку нижним ограничением является Apple, мы не знаем, безопасно ли включать Fruit в такой List, так как это откроет List для добавления типов, отличных от Apple, с нарушением статической безопасности типов.

Ограничения супертипов расширяют возможности по передаче аргументов методу:

//. generics/GenericWriting.java

import java.util.*;

public class GenericWriting {

static void writeExact(List list. T item) { list.add(item),

}

static List apples = new ArrayList();

static List fruit = new ArrayList();

static void flO {

writeExact(apples, new AppleO);

// writeExact(fruit, new AppleO); // Ошибка:

// Несовместимые типы: обнаружен Fruit, требуется Apple

}

static void

writeWithWildcard(List list, T item) { list.add(item);

}

static void f20 {

writeWithWildcard(apples, new AppleO); writeWithWildcard(fruit, new AppleO);

}

public static void main(String[] args) { flO, f2(); }

} ///.-

Метод writeExact() использует параметр типа «как есть», без метасимволов. На примере fl() мы видим, что этот способ отлично работает — при условии, что в List помещаются только объекты Apple. Однако writeExact() не позволяет поместить Apple в List, хотя мы знаем, что это должно быть возможно.

В writeWithWildcard() используется аргумент List, поэтому List содержит конкретный тип, производный от Т; следовательно, Т или производные от него типы могут безопасно передаваться в аргументе методов List. Пример встречается в f2: как и прежде, Apple можно поместить в List, но, как и предполагалось, также стало можно поместить Apple в List.

Неограниченные метасимволы

Казалось бы, неограниченный метасимвол должен означать «все, что угодно», а его использование эквивалентно использованию низкоуровневого типа. В самом деле, на первый взгляд компилятор подтверждает эту оценку:

//: generics/UnboundedWi1dcardsl.java

import java.util.*;

public class UnboundedWildcardsl {

static List listl;

static List list2;

static List list3;

static void assignldist list) { listl = list; 1i st2 = list;

// list3 = list; // Предупреждение: непроверенное преобразование // Обнаружен List, требуется List

}

static void assign2(List list) { listl = list; list2 = list; list3 = list;

}

static void assign3(List list) { listl = list; list2 = list; list3 = list;

}

public static void main(String[] args) { assignl(new ArrayListO): assign2(new ArrayList()); // assign3(new ArrayListO); // Предупреждение-// Непроверенное преобразование. Обнаружен- ArrayList // Требуется: List assignl(new ArrayLi st0); assign2(new ArrayList0); assign3(new ArrayList0); // Приемлемы обе формы-List wildList = new ArrayListO; wildList = new ArrayList(); assignl(wildList); assign2(wildList); assign3(wildLi st);

}

} ///:-

Во многих ситуациях, подобных рассмотренной, для компилятора совершенно не существенно, используется низкоуровневый тип или . Конструкцию можно считать обычным украшением; впрочем, она обладает некоторой практической ценностью, потому что фактически означает: «Код написан с учетом параметризации Java, и здесь эта конструкция означает не то, что я использую низкоуровневый тип, а то, что параметр параметризации может содержать произвольный тип».

Второй пример демонстрирует важное практическое использование неограниченных метасимволов. Когда вы имеете дело с несколькими параметрами, иногда важно указать, что один параметр может относиться к произвольному типу, а другой ограничить определенным типом:

//: generics/UnboundedWi1dcards2.java

import java.util.*;

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных