Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
А теперь допустим, что требуется создать метод, принимающий аргумент любого типа, соответствующего объекту класса Gen, при условии, что в качестве параметра типа этого объекта указывается класс А или его подклассы. Иными словами, требуется создать метод, который оперирует только объектами типа Gen<тип>, где тип — это класс А или его подклассы. Для этой цели нужно воспользоваться ограниченным метасимволь- ным аргументом. Ниже для примера приведено объявление метода test (), которому в качестве аргумента может быть передан только объект класса Gen, на параметр типа которого накладываются следующие ограничения: соответствие классу А или его подклассам.
// Здесь знак ? устанавливает соответствие
// классу А или производным от него подклассам,
static void test(Gen<? extends A> o) {
// ...
}
А приведенный ниже пример класса демонстрирует типы объектов класса Gen, которые могут быть переданы методу test ().
class UseBoundedWildcard {
// Здесь знак ? устанавливает соответствие
// классу А или производным от него подклассам.
//В объявлении этого метода используется ограниченный
// метасимвольный аргумент.
static void test(Gen<? extends A> о) {
// ...
}
public static void main(String args[]) {
A a = new A();
В b = new В() ;
С с = new C();
D d = new D() ;
Gen<A> w = new Gen<A>(a);
Gen<B> w2 = new Gen<B>(b);
Gen<C> w3 = new Gen<C>(c);
Gen<D> w4 = new Gen<D>(d);
// Эти вызовы метода test() допустимы, так как
// объекты w, w2 и w3 относятся к подклассам А.
test(w);
test(w2);
test(w3);
//А этот вызов метода test() недопустим, так как
// объект не относится к подклассу Л.
// test(w4); // Ошибка!
}
}
В методе main () создаются объекты классов А, В, С и D. Затем они используются для создания четырех объектов класса Gen (по одному на каждый тип). После этого метод test () вызывается четыре раза, причем последний его вызов закомментирован. Первые три вызова вполне допустимы, поскольку w, w2 и w3 являются объектами класса Gen, типы которых определяются^ классом А или производными от него классами. А последний вызов метода test () недопустим, потому что w4 — это объект класса D, не являющегося производным от к класса А. Следовательно, ограниченный метасимвольный аргумент в методе test () не позволяет передавать ему объект w4 в качестве параметра.
В целом верхняя граница для метасимвольного аргумента задается в следующей общей форме:
<? extends суперкласс >
где после ключевого слова extends указывается суперкласс, т.е. имя класса, определяющего верхнюю границу, включая и его самого. Это означает, что в качестве аргумента допускается указывать не только подклассы данного класса, но и сам этот класс.
По мере необходимости можно также указать нижнюю границу для метасимвольного аргумента. Для этой цели служит ключевое слово super, указываемое в следующей общей форме:
<? extends подкласс >
В данном случае в качестве аргумента допускается использовать только суперклассы, от которых наследует подкласс, исключая его самого. Это означает, что подкласс, определяющий нижнюю границу, не относится к числу классов, передаваемых в качестве аргумента.
В этом случае следующее приведение типов может быть выполнено, поскольку переменная х указывает на экземпляр класса Gen<Integer>:
(Gen) х // Допустимо
А следующее приведение типов не может быть выполнено, поскольку переменная х не указывает на экземпляр класса Gen<Long>:
(Gen) х // Недопустимо
## Обобщенные методы