Читаем Философия 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, как это делает компилятор при стирании, программа откомпилируется.

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

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

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

Access 2002: Самоучитель
Access 2002: Самоучитель

В книге рассматривается широкий круг вопросов, связанных с использованием программной среды Access 2002, которая является составной частью пакета Office 2002 и предназначена для создания банка данных в самых различных предметных областях.Подробно описывается методика проектирования объектов базы данных (таблицы, формы, отчеты, страницы доступа к данным, запросы, модули).Детально обсуждаются вопросы создания интегрированной базы данных в единой среде Access 2002: формирование БД с нуля, конвертирование в программную среду баз данных, созданных в ином программном окружении – Clarion, FoxPro.Особое внимание уделяется формированию разнообразных запросов к интегрированной базе данных Access 2002 с использованием языков программирования SQL, VBA и макросов.Приводятся общие сведения о возможностях языка обмена данными между различными компьютерами и приложениями (XML). Описываются возможности использования гиперссылок, связывающих базу данных с другими программными продуктами. Объясняется, как можно работать с базой данных Access 2002 без установки ее на компьютер, используя технологию ODBC (Open Data Base Connectivity). В приложениях приводятся количественные параметры Access 2002 и связанная с этой СУБД терминология.Предлагаемая книга будет полезна специалистам, занимающимся практической разработкой банков данных и приложений на их основе, а также студентам вузов, изучающим информатику.

Павел Юрьевич Дубнов

Программирование, программы, базы данных / ОС и Сети / Книги по IT