Обобщения действуют только со ссылочными типами
Задача: Написать класс, переменная экземпляра, в котором может быть ссылкой на объект любого типа (другими словами, класс, который может манипулировать (своими методами) объектами любого заданного типа), т.е. класс-каркас (действия одни и те же, а объекты, над которыми производятся эти действия могут быть любыми). // Класс NonGen – псевдообобщение с помощью класса Object class NonGen { Object оЬ ; // объект оЬ теперь имеет тип O Ь ject // передать конструктору с сылку на объект типа O Ь ject NonGen ( Object о) {оЬ = о;} // возвратить тип OЬject Object getob ( ){return оЬ;} // показать тип объекта оЬ void showType ( ) { System.out.println ("O бъ e кт оЬ относится к типу " + оЬ. getClass ( ). getName ( )) ; } } // продемонстрировать необобщенный класс class NonGenDemo { public static void main( String args[ ]) { NonGen iOb ; // создать объект типа NonGen и сохранить в нем // объект типа Integer . Выполняется автоупаковка iOb = new NonGen (88) ; // равносильно iOb = new NonGen (new Integer(88)) ; // показать тип данных, хранящихся в переменной i ОЬ iOb . showType ( ); // получить значение переменной i ОЬ, // на этот раз требуется приведение типов int v = (Integer) iOb.getob( ); System.out.println ("Знaчeниe: " + v ) ; System . out . println ( ) ; // создать другой объект типа NonGen и //сохранить в нем объект типа Strinq NonGen strOb = new NonGen ( "Tecт без обобщений" ) ; // показать тип данных, хранящихся в переменной strOb strOb . showType ( ) ; // получи n ь значение переменной strOb , // И в этом случае потребуется приведение типов String str = (String) strOb.getob ( ) ; System.out.println ( "Знaчeниe : " + str ) ; // этот код компилируется, но он принципиально неверный! iOb = strOb ; v = ( Integer ) iOb . getob ( ) ; // Ошибка во время выполнения! } } Без обобщений компилятор просто не в состоянии обнаружить такую ошибку. А ошибка времени выполнения – это плохо!
Обобщенные классы - каркасы (тип объекта передается как параметр). //Простой обобщенный класс. // Здесь Т обозначает имя параметра типа, // который будет заменен реальным типом // при создании объекта типа Gen
class Gen < T > { T ob ; //объявить объект типа T //передать конструктору ссылку на объект типа Т Gen (T o) {ob = o;} //возвратить объект оЬ T getob ( ) {return ob ;} // показать тип Т void showType ( ) { System.out.println ("Tипoм Т является " + ob.getClass( ).getName ( ) ) ; } } // продемонстрировать применение обобщенного класса class GenDemo { public static void main ( String args[ ]){ //Создать ссылку типа Gen для целых чисел Gen <Integer> iOb ; // Создать объект типа Gen <Integer> и присвоить //ссылку на него переменной iОЬ . Обратите внимание на //применение автоупаковки для инкапсуляции значения 88 // в объекте типа Inteqer iOb = new Gen <Integer> (88) ; // показать тип данных, хранящихся в переменной iОЬ iOb.showType( ); //получить значение переменной iОЬ. Обратите внимание на то, // что для этого не требуется никакого приведения типов int v = iOb.getob( ); System.out.println ( " Зн a ч e ни e: " + v ) ; System.out.println ( ) ; // создать объект типа Gen для символьных строк Gen <String> strOb = new Gen <String> (" Тест обобщений "); //показать тип данных, хранящихся в переменной strOЬ strOb.showType( ) ; //получить значение переменной strOЬ. И в этом случае // приведение типов не требуется String str = strOb.getob( ) ; System.out.println (" Зн a ч e ни e: " + str) ; System.out.println ( ) ; // создать объект типа Gen для объектов класса Student Gen <Student> studOb = new Gen <Student> (new Student (12345, "Воробьев", 4.8 f )); //показать тип данных, хранящихся в переменной studOЬ studOb.showType( ) ; //получить значение переменной studOЬ. И в этом случае // приведение типов не требуется Student stud = studOb . getob ( ) ; System.out.println (" Зн a ч e ни e: " + stud) ; }} Обобщения действуют только со ссылочными типами Gen < int > intOb = new Gen<int > ( 5 3 ) ; / / ОШИБКА ! Использовать / / примитивные типы нельзя!
Популярное: Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (199)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |