Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Java — реализация параметризованных интерфейсов

Anna | 4.06.2014 | нет комментариев
Приветствую всех постигающих Java!
На днях, ковыряя холодным осенним вечером Эккеля (Thinking in Java 4ed), окончательно во каждому запутался. Читаю короткий абзац:

Реализация параметризованных интерфейсов
Класс не может реализовывать две разновидности одного параметризованного интерфейса — в итоге стирания они будут считаться одним и тем же интерфейсом. Пример раздора такого рода:

interface Payable<T> {}

class Employee implements Payable<Employee> {}
class Hourly extends Employee implements Payable<Hourly> {}

Класс Hourly компилироваться не будет, потому что стирание уменьшает Payable<Employee> и Payable<Hourly> до Payable, а в приведенном примере это обозначало бы двукратную реализацию одного интерфейса. Увлекательная подробность: если удалить параметризованные доводы из обоих упоминаний Payable, как это делает компилятор при стирании, программа откомпилируется.

Сразу оговорюсь — обстановка не является боевой, легко хочется типично разобраться с теорией.
Разумеется заподозрил неладное, накидал по-стремительному исходник в Eclips`e… работает, собака, как и сказано.
Если начать чистить селёдку так сказать с хвоста, то вопросов к последнему заявлению легко никаких:

если удалить параметризованные доводы из обоих упоминаний Payable, как это делает компилятор при стирании, программа откомпилируется

То есть будет:

class Employee implements Payable {}
class Hourly extends Employee implements Payable {}

OK, все типично, интерфейс один и тот же, интерфейсы не наследуются, а значит в иерархии наследования дозволено сколько желательно реализовывать один и тот же интерфейс.
Чистим пузо селёдки:

… стирание уменьшает Payable<Employee> и Payable<Hourly> до Payable…

таак, немножко пожёстче. Стирание не разрешает получать информацию о типе внутри параметризованного кода, компилятор генерит обыкновенный НЕпараметризованый байт-код. Отлично, Payable<Employee> и Payable<Hourly> стираются до ближайшего ограничения (а ограничений на параметр типа у нас нет —interface Payable<T> {}) либо до «низкоуровневого» типа Payable.
Приближаемся к голове селедки:

Класс не может реализовывать две разновидности одного параметризованного интерфейса — в итоге стирания они будут считаться одним и тем же интерфейсом

ну, здОрово, компилятор легко сотрёт Payable<Employee> и Payable<Hourly> до Payable и всё. Видимо, не всё. И в довершение абсолютно непонятная фраза:

… в приведенном примере это обозначало бы двукратную реализацию одного интерфейса.

Вот как сие понимать?

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB