Gen strOb = new Gen(53); // Ошибка. Использовать простой тип нельзя! Очевидно, что запрет на использование простых типов не является серьезным ограничением, поскольку всегда можно воспользоваться классом оболочки типа, инкапсулировав в нем значение простого типа, что и было продемонстрировано в предыдущем примере программы. А поддержка в Java автоупаковки и автораспаковки еще больше упрощает применение оболочек типов в обобщениях. ### Различение обобщений по аргументам типа Для лучшего усвоения обобщенных типов следует иметь в виду, что ссылка на один вариант некоторого обобщенного типа несовместима с другим вариантом того же самого обобщенного типа. Так, если бы в рассмотренном выше примере программы присутствовала приведенная ниже строка кода, компилятор выдал бы сообщение об ошибке.
iOb = strOb; // Ошибка!
Несмотря на то что обе переменные, iOb и strOb, относятся к типу 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", "В"); В данном случае в качестве обоих параметров типа Т и V передается один и тот же тип String. Очевидно, что если аргументы типа совпадают, то определять два параметра типа в обобщенном классе нет никакой надобности. ### Общая форма обобщенного класса Синтаксис обобщений, представленных в предыдущих примерах, может быть сведен к общей форме. Ниже приведена общая форма объявления обобщенного класса.
class имя