Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Герберт Шилдт. Java 2, v5.0 (Tiger). Новые возм...doc
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
1.21 Mб
Скачать

Настраиваемый подкласс

Не настраиваемый класс вполне может быть суперклассом для настраиваемого подкласса. Рассмотрим программу из листинга 3.14.

Листинг 3.14. Не настраиваемый класс в качестве суперкласса для настраиваемого подкласса

class NonGen {

int num;

NonGen(int i) {

num = i;

}

int getnum() {

return num;

}

}

// A generic subclass.

class Gen<T> extends NonGen {

T ob; // declare an Object of type T

// Pass the constructor a reference to

// an Object of type T.

Gen(T o, int i) {

super(i);

ob = o;

}

// Return ob.

T getob() {

return ob;

}

}

// Create a Gen Object.

class HierDemo2 {

public static void main(String args[]) {

// Create a Gen Object for String.

Gen<String> w = new Gen<String>("Hello", 47);

System.out.print(w.getob() + " ");

System.out.println(w.getnum());

}

}

Вывод результатов работы программы из листинга 3.14 приведен в следующей строке:

Hello 47

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

class Gen<T> extends NonGen {

Поскольку класс NonGen не настраиваемый, в нем не задан аргумент типа. Следовательно, несмотря на то, что в классе Gen объявлен параметр T, он не нужен классу NonGen (и не может им использоваться). Таким образом, класс Gen унаследовал класс NonGen обычным способом без каких-либо специальных условий.

Сравнения типов настраиваемой иерархии во время выполнения программы

Несколько слов об операции времени выполнения instanceof для получения информации о типе. Она определяет, является ли объект экземпляром класса. Результат операции равен true, если объект заданного типа, или может быть преобразован в объект заданного типа. Операцию instanceof можно применять к объектам настраиваемых классов. В листинге 3.15 приведено описание класса, демонстрирующего некоторые проверки вида "если — то" типовой совместимости иерархии настраиваемых классов.

Листинг 3.15. Применение операции inetanceof к иерархии настраиваемых классов

class Gen<T> {

T ob;

Gen(T o) {

ob = o;

}

// Return ob.

T getob() {

return ob;

}

}

// A subclass of Gen.

class Gen2<T> extends Gen<T> {

Gen2(T o) {

super(o);

}

}

// Demonstrate runtime type ID implications of generic class hierarchy.

class HierDemo3 {

public static void main(String args[]) {

// Create a Gen Object for Integers.

Gen<Integer> iOb = new Gen<Integer>(88);

// Create a Gen2 Object for Integers.

Gen2<Integer> iOb2 = new Gen2<Integer>(99);

// Create a Gen2 Object for Strings.

Gen2<String> strOb2 = new Gen2<String>("Generics Test");

// See if iOb2 is some form of Gen2.

if(iOb2 instanceof Gen2<?>)

System.out.println("iOb2 is instance of Gen2");

// See if iOb2 is some form of Gen.

if(iOb2 instanceof Gen<?>)

System.out.println("iOb2 is instance of Gen");

System.out.println();

// See if strOb2 is a Gen2.

if(strOb2 instanceof Gen2<?>)

System.out.println("strOb is instance of Gen2");

// See if strOb2 is a Gen.

if(strOb2 instanceof Gen<?>)

System.out.println("strOb is instance of Gen");

System.out.println();

// See if iOb is an instance of Gen2, which its not.

if(iOb instanceof Gen2<?>)

System.out.println("iOb is instance of Gen2");

// See if iOb is an instance of Gen, which it is.

if(iOb instanceof Gen<?>)

System.out.println("iOb is instance of Gen");

// The following can't be compiled because

// generic type info does not exist at runtime.

// if(iOb2 instanceof Gen2<Integer>)

// System.out.println("iOb2 is instance of Gen2<Integer>");

}

}

Далее приведен вывод результатов работы программы:

iOb2 is instance of Gen2

iOb2 is instance of Gen

strOb is instance of Gen2

strOb is instance of Gen

iOb is instance of Gen