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

// Object rl = exactl(raw); // Предупреждение // Непроверенное преобразование Holder в Holder // Непроверенный вызов метода: exactlCHolder) // применяется к (Holder) Long r2 = exactl(qualified),

Object r3 = exactl(unbounded), // Должен возвращать Object Long r4 = exactl(bounded),

// Long r5 = exact2(raw, Ing); // Предупреждения-

// Непроверенное преобразование Holder в Holder

// Непроверенный вызов метода. exact2(Holder,T)

// применяется к (Holder,Long)

Long гб = exact2(qualified, Ing),

// Long r7 = exact2(unbounded. Ing), // Ошибка-

// exact2(Holder,T) не может применяться к

// (Holder,Long)

// Long r8 = exact2(bounded, Ing), // Ошибка.

// exact2(Holder,T) не может применяться

// к (Holder,Long)

// Long r9 = wildSubtype(raw, Ing); // Предупреждения

// Непроверенное преобразование Holder

// к Holder

// Непроверенный вызов метода-

// wildSubtype(Holder,T)

// применяется к (Holder.Long)

Long rlO = wildSubtype(qualified. Ing);

// Допустимо, но возвращать может только Object-

Object rll = wildSubtype(unbounded. Ing).

Long rl2 = wildSubtype(bounded. Ing).

// wildSupertype(raw, Ing); // Предупреждения. // Непроверенное преобразование Holder // к Holder // Непроверенный вызов метода: // wildSupertype(Holder,T) // применяется к (Holder.Long) wildSupertype(qualified, Ing), // wildSupertype(unbounded, Ing); // Ошибка:

// wildSupertype(Holder,T) не может продолжение&

// применяться к (Holder,Long) // wiIdSupertypeCbounded, Ing); // Ошибка: // wildSupertype(Holder,T) не может // применяться к (Holder.Long)

}

} ///:-

В методе rawArgs() компилятор знает, что Holder является параметризованным типом, поэтому несмотря на то, что здесь он выражен как низкоуровневый тип, компилятору известно, что передача Object методу set() небезопасна. Так как в данном случае используется низкоуровневый тип, методу set() можно передать объект произвольного типа, и он будет преобразован в Object. Таким образом, при использовании низкоуровневого типа вы лишаетесь проверки на стадии компиляции. Вызов get() демонстрирует ту же проблему: никакого Т нет, поэтому результатом может быть только Object.

Может создаться впечатление, что низкоуровневый Holder и Holder — приблизительно одно и то же. Однако метод unboundedArgs() демонстрирует различия между ними — в нем выявляются те же проблемы, но информация о них выдается в виде ошибок, а не предупреждений, поскольку низкоуровневый Holder может содержать разнородные комбинации типов, тогда как Holder содержит однородную коллекцию одного конкретного типа.

В exactl() и exact2() используются точные параметры типов (то есть без метасимволов). Мы видим, что exact2() обладает иными ограничениями, нежели exactl(), из-за дополнительного аргумента.

В wildSubtype() ограничения на тип Holder опускаются до Holder с элементами любого типа, удовлетворяющими условию extends Т. И снова это означает, что Т может быть типом Fruit, a holder сможет вполне законно стать Holder . Чтобы предотвратить возможное размещение Orange в Holder, вызовы set() (и любых других методов, получающих в аргументах параметр типа) запрещены. Однако мы знаем, что все объекты, полученные из Holder, по меньшей мере, являются Fruit, поэтому вызов get() (или любого метода с возвращаемым значением параметра типа) допустим.

Реализация параметризованных интерфейсов

Класс не может реализовать две разновидности одного параметризованного интерфейса — вследствие стирания они будут считаться одним и тем же интерфейсом. Пример конфликта такого рода:

II: generics/MultiplelnterfaceVariants.java

II {CompileTimeError} (He компилируется)

interface Payable {}

class Employee implements Payable {}

class Hourly extends Employee

implements Payable {} ///:-

Класс Hourly компилироваться не будет, потому что стирание сокращает Payable и Payable до Payable, а в приведенном примере это означало бы двукратную реализацию одного интерфейса. Интересная подробность: если удалить параметризованные аргументы из обоих упоминаний Payable, как это делает компилятор при стирании, программа откомпилируется.

Преобразования типов и предупреждения

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

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

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

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

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

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

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

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

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