Мегаобучалка Главная | О нас | Обратная связь


Обобщения действуют только со ссылочными типами



2019-07-03 199 Обсуждений (0)
Обобщения действуют только со ссылочными типами 0.00 из 5.00 0 оценок




Задача: Написать класс, переменная экземпляра, в котором может быть ссылкой на объект любого типа (другими словами, класс, который может манипулировать (своими методами) объектами любого заданного типа), т.е. класс-каркас (действия одни и те же, а объекты, над которыми производятся эти действия могут быть любыми).

// Класс 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 ) ; / / ОШИБКА ! Использовать

                                                            / / примитивные типы нельзя!



2019-07-03 199 Обсуждений (0)
Обобщения действуют только со ссылочными типами 0.00 из 5.00 0 оценок









Обсуждение в статье: Обобщения действуют только со ссылочными типами

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (199)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)