Использование обобщенного суперкласса

Ниже приведен пример иерархии, которая использует обобщенный суперкласс:

// Простая иерархия обобщенных классов.
class Gen {
Т ob;
Gen(T о) {
ob = о;
}
// Возвращает ob.
Т getob () {
return ob;
}
}
// Подкласс Gen.
class Gen2 extends Gen {
Gen2(T o) {
super(o);
}

В этой иерархии Gen2 расширяет обобщенный класс Gen. Обратите внимание на то, как в следующей строке объявлен Gen2:

class Gen2 extends Gen {

Параметр типа T специфицирован в Gen2 и также передается Gen в операторе extends. Это значит, что тип, переданный Gen2, будет также передан Gen. Например, следующее объявление

Gen2 num = new Gen2(100);

передает Integer как параметр типа классу Gen. То есть ob внутри части Gen класса Gen2 будет иметь тип Integer. Отметим также, что Gen2 никак не использует параметр типа Т, кроме того, что передает его суперклассу Gen. Даже если подкласс обобщенного суперкласса никак не нуждается в том, чтобы быть обобщенным, несмотря на это он все же должен специфицировать параметры типа, необходимые его обобщенному суперклассу.

Конечно, при необходимости подкласс может добавлять свои собственные параметры типа. Например, ниже показан вариант предыдущей иерархии, в котором Gen2 добавляет собственный параметр типа:

// Подкласс может добавлять свои собственные параметры типа.
class Gen {
Т ob; // Объявление объекта типа Т
// Передача конструктору
// ссылки на объект типа Т.
Gen(T о) {
ob = о;
}
// Возвращает ob.
Т getob () {
return ob;
}
}
// Подкласс Gen, который определяет
// второй параметр типа по имени V.
class Gen2 extends Gen {
V ob2;
Gen2 (T о, V o2) {
super (o) ;
ob2 = o2;
}
V getob2 () {
return ob2;
}
}
// Создание объекта типа Gen2.
class HierDemo {
public static void main(String args[]) {
// Создание объектов Gen2 для String и Integer.
Gen2 x = new Gen2("Значение равно: ", 99);
System.out.print (x.getobO ) ;
System.out.println(x.getob2());
}
}

Обратите внимание на объявление Gen2, показанное в следующей строке: class Gen2 extends Gen {

Здесь T — тип, переданный Gen, а V — тип, специфичный для Gen2. V используется для объявления объекта, названного оЬ2, а также в качестве типа возврата метода getob2 (). В main () создается объект Gen2 с типом String для параметра Т и типом Integer для параметра V.

Программа выдает следующий вполне ожидаемый результат: Значение равно: 99