Теперь возвращаемым типом методаGetOb являетсяobject,а следовательно, для распаковки значения, возвращаемого методомGetOb , и его последующего сохранения в переменнойvтребуется явное приведение к типуint.Если исключить приведение типов, программа не будет скомпилирована. В обобщенной версии этой программы приведение типов не требовалось, поскольку типintуказывался в качестве аргумента типа при создании объектаiOb.А в необобщенной версии этой программы потребовалось явное приведение типов. Но это не только неудобно, но и чревато ошибками.
А теперь рассмотрим следующую последовательность кода в конце анализируемой здесь программы.
// Этот код компилируется, но он принципиально неверный! iOb = strOb;
// Следующая строка кода приводит к исключительной // ситуации во время выполнения.
// v = (int) iOb.GetObO; // Ошибка при выполнении!
В этом коде значение переменнойstrObприсваивается переменнойiOb.Но переменнаяstrObссылается на объект, содержащий символьную строку, а не целое значение. Такое присваивание оказывается верным с точки зрения синтаксиса, поскольку все ссылки на объекты классаNonGenодинаковы, а значит, по ссылке на один объект классаNonGenможно обращаться к любому другому объекту классаNonGen.Тем не менее такое присваивание неверно с точки зрения семантики, как показывает следующая далее закомментированная строка кода. В этой строке тип, возвращаемый методомGetOb , приводится к типуint,а затем предпринимается попытка присвоить полученное в итоге значение переменнойint.К сожалению, в отсутствие обобщений компилятор не сможет выявить подобную ошибку. Вместо этого возникнет исключительная ситуация во время выполнения, когда будет предпринята попытка приведения к типуint.Для того чтобы убедиться в этом, удалите символы комментария в начале данной строки кода, скомпилируйте, а затем выполните программу. При ее выполнении возникнет ошибка.
Упомянутая выше ситуация не могла бы возникнуть, если бы в программе использовались обобщения. Компилятор выявил бы ошибку в приведенной выше последовательности кода, если бы она была включена в обобщенную версию программы, и сообщил бы об этой ошибке, предотвратив тем самым серьезный сбой, приводящий к исключительной ситуации при выполнении программы. Возможность создавать типизированный код, в котором ошибки несоответствия типов выявляются во время