Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
При определении экземпляра обобщенного класса аргумент типа, передаваемый в качестве параметра типа, должен обозначать тип класса. Для этой цели нельзя использовать простой тип, например int или char. В примере с классом Gen в качестве параметра типа Т можно передать любой класс, но не простой тип данных. Иными словами, следующее объявление недопустимо:
Gen strOb = new Gen(53); // Ошибка. Использовать простой тип нельзя!
Очевидно, что запрет на использование простых типов не является серьезным ограничением, поскольку всегда можно воспользоваться классом оболочки типа, инкапсулировав в нем значение простого типа, что и было продемонстрировано в предыдущем примере программы. А поддержка в Java автоупаковки и автораспаковки еще больше упрощает применение оболочек типов в обобщениях.
### Различение обобщений по аргументам типа
Для лучшего усвоения обобщенных типов следует иметь в виду, что ссылка на один вариант некоторого обобщенного типа несовместима с другим вариантом того же самого обобщенного типа. Так, если бы в рассмотренном выше примере программы присутствовала приведенная ниже строка кода, компилятор выдал бы сообщение об ошибке.
iOb = strOb; // Ошибка!
Несмотря на то что обе переменные, iOb и strOb, относятся к типу Gen<T>, они являются ссылками на объекты разного типа, поскольку при их объявлении указаны разные аргументы типа. Это часть той типовой безопасности обобщений, благодаря которой предотвращаются программные ошибки.
### Обобщенный класс с двумя параметрами типа
В обобщенном классе можно задать несколько параметров типа. В этом случае параметры типа разделяются запятыми. Например, приведенный ниже класс TwoGen является переделанной версией класса Gen, в которой определены два параметра типа.
// Простой обобщенный класс с двумя параметрами типа: Т и V.
class TwoGen { // Применение двух параметров типа
Т оb1;
V оb2;
// передать конструктору класса ссылки на объекты типов Т и V
TwoGen(Т ol, V о2) {.
ob1 = ol;
оb2 = о2;
}
// отобразить типы Т и V
void showTypes() {
System.out.println("Type of T is " +
obi.getClass().getName());
System.out.println("Type of V is " +
ob2.getClass().getName());
}
T getobl() {
return obi;
}
V getob2() {
return ob2;
}
}
// продемонстрировать класс TwoGen
class SimpGen {
public static void main(String args[]) {
// Здесь в качестве параметра типа Т передается тип
// Integer, а в качестве параметра типа V - тип String.
TwoGen tgObj =
new TwoGencinteger, String>(88, "Generics");
// отобразить конкретные типы
tgObj.showTypes();
// получить и отобразить отдельные значения
int v = tgObj.getobl();
System.out.println("value: " + v);
String str = tgObj.getob2();
System.out.println("value: " + str);
}
}
Выполнение этой программы дает следующий результат:
Type of Т is java.lang.Integer
Type of V is java.lang.String
value: 88
value: Generics
Обратите внимание на приведенное ниже объявление класса TwoGen.
class TwoGen {
Здесь определяются два параметра типа, т и V, разделяемые запятыми. А поскольку в этом классе используются два параметра типа, то при создании его объекта следует непременно указывать оба аргумента типа, как показано ниже.
TwoGen tgObj =
new TwoGencinteger, String>(88, "Generics");
В данном случае тип Integer передается в качестве параметра типа т, а тип String — в качестве параметра типа V. И хотя в этом примере аргументы типа отличаются, они могут в принципе и совпадать. Например, следующая строка кода считается вполне допустимой:
TwoGen х = new TwoGen("A", "В");