2016 экзамен ответы вариант 1 (Решённые задачи прошлых лет), страница 2
Описание файла
Файл "2016 экзамен ответы вариант 1" внутри архива находится в папке "Решённые задачи прошлых лет". PDF-файл из архива "Решённые задачи прошлых лет", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
ответ и замечания по поводу задачи 2-6 из второго варианта, только в Javaограничения могут быть ТОЛЬКО в форме наследования класса или интерфейса (ещепроще)interface Arithmetic<T> {T Add(T x);T Mult(T x);T Sub(T x);T Div(T x);}class CalcSort<T extends Comparable<T>, Arithmetic<T> { … }Задача 1-7Дайте определение и пример локального анонимного класса в языке Java. Есть ли аналогичное понятие вязыках С++ или С#?ОтветКоротко: детали ответа можно найти в книге Гослинга, Арнольда и Холмса «Языкпрограммирования Java» 3-е издание, п.5.4. Анонимные внутренние классы, стр.148.В С# и C++ такого понятия нет.Замечание.
Постоянная (и грубая) ошибка: путать внутренние и вложенные классы.Это - «две большие разницы». Подробно и обстоятельно написано там же в 5 главе«Вложенные классы и интерфейсы».Задача 1-8Пусть программа на языке C# содержит следующий ошибочный фрагмент:class D { }interface IFace <T, R>{R Generate();void Process(T x);}IFace<D, Object> f1 = new ObjectFace(); //error!IFace<D, Object> f2 = new DFace(); //error!class ObjectFace : IFace<Object, Object> {public Object Generate() { return new Object();}public void Process(Object x) {}}class DFace : IFace<D, D> {public D Generate() { return new D(); }public void Process(D x) { }}Объясните, в чем состоит ошибка, и исправьте РОВНО ОДНУ строчку во фрагменте так, чтобы ошибкаисчезла.ОтветОшибка состоит в том, что по правилам языка конкретизации обобщенных интерфейсов(без указания вариантности по параматрам) инвариантны, если их фактические типыпараметры различны (независимо от вариантности типов-параметров).
Поэтому IFace<D,Object> не приводится ни к IFace<Object, Object>, ни к IFace<D, D> (это и естьинвариантность).В Java, кстати, такая же история. Но решается проблема в C# и Java по-разному. В C#вариантность интерфейса указывается при определении самого интерфейса по каждомутипу — ковариантность указывается как out, а контравариантность — как in, чтохорошо согласуется с тем, как типы-параметры используются в методах обобщенногоинтерфейса.Интерфейс IFace ковариантен по типу R, и контравариантен по типу T. Поэтому вместоinterface IFace <T, R>надо поставитьinterface IFace <in T, out R>.