Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
В классе MyGenClass объявлены два обобщенных типа: Т и V. В этом классе предпринимается попытка перегрузить метод set (). Перегружаемые методы отличаются параметрами типа т и V. Казалось бы, это не должно приводить к ошибке, поскольку типы Т и V отличаются. Но здесь возникают два затруднения в связи с неоднозначностью.
Прежде всего, в классе MyGenClass не указано никаких требований, чтобы типы Т и V действительно отличались. В частности, не является принципиальной ошибкой создание объекта типа MyGenClass так, как показано ниже.
MyGenClass obj = new MyGenClass()
В данном случае типы Т и V заменяются типом String. В результате оба варианта метода set () становятся совершенно одинаковыми, что, безусловно, считается ошибкой.
Второе, более серьезное затруднение возникает в связи с тем, что при стирании обобщенных типов оба варианта метода set () преобразуются в следующий вид:
void set(Object о) { // ...
Таким образом, попытка перегрузить метод set () в классе MyGenClass является существенно неоднозначной. В качестве выхода из этого затруднительного положения может стать отказ от перегрузки и использование двух разных имен методов.
## Ограничения, накладываемые на обобщения
На обобщения накладывается ряд ограничений, которые следует учитывать при их употреблении в программах на Java. К числу подобных ограничений относится создание объектов, определяемых параметром типа, использование статических членов класса, генерирование исключений и обращение с массивами. Рассмотрим все эти ограничения более подробно.
### Невозможность получить экземпляры параметров типа
Экземпляр параметра типа получить невозможно. Рассмотрим в качестве примера следующий класс:
// Экземпляр типа Т получить нельзя,
class Gen {
Т ob;
Gen () {
ob = new T(); // Недопустимо!!!
}
}
В данном примере любая попытка получить экземпляр типа т приводит к ошибке. Ее причину понять нетрудно: компилятору ничего не известно о типе создаваемого объекта, поскольку тип Т является заполнителем, который стирается во время компиляции.
### Ограничения, накладываемые на статические члены класса
В статических членах нельзя использовать параметры типа, объявленные в содержащем их классе. Так, все объявления статических членов в приведенном ниже классе недопустимы.
class Wrong {
// Статическую переменную типа Т создать нельзя,
static Т ob;
// В статическом методе нельзя использовать тип Т.
static Т getob() {
return ob;
}
// Статический метод не может обращаться к объекту типа Т.
static void showob() {
System.out.println(ob);
}
}
Несмотря на наличие описанного выше ограничения, допускается все же объявлять обобщенные статические методы, в которых используются собственные параметры типа. Примеры таких объявлений приводились ранее в этой главе.
### Ограничения, накладываемые на обобщенные массивы
На массивы обобщенного типа накладываются два существенных ограничения. Во- первых, нельзя получить экземпляр массива, тип элементов которого определяется параметром типа. И во-вторых, нельзя создать массив обобщенных ссылок на объекты конкретного типа. Оба эти ограничения демонстрируются в приведенном ниже кратком примере программы.
// Обобщенные типы и массивы,
class Gen {
T ob;
T vals[]; // Допустимо.
Gen(T о, T[] nums) {
ob = о;
// Следующее выражение недопустимо:
// vals = new Т[10]; // Нельзя создать массив типа Т.
// Следующее выражение составлено верно.
vals = nums; // Переменной допускается присваивать ссылку
// на существующий массив.
}
}
class GenArrays {
public static void main(String args[]) {
Integer n[] = { 1, 2, 3, 4, 5 };