2016-10-22 4 views
3

В официальной документации Java есть несколько упражнений с ответами в конце главы generics. Я смог решить большинство, однако один ответ мне не ясен. Вы можете найти вопросы и ответы here. Я не понимаю, ответ на вопрос 8. Почему они пишутJava generics excercise - answer information

<T extends Object & Comparable<? super T>> 

Я пишу

<T extends Comparable<? super T>> 

и не понимаю, почему проходит объект необходимо или лучше.

+0

Существует более обсуждение этого «трюк» здесь: http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#FAQ104 –

+0

Спасибо за ваши комментарии, они были очень полезно! Насколько я понимаю, расширение объекта необязательно и только вставлено для того, чтобы не сломать устаревший api, что является более или менее ошибкой. Так что было бы совершенно нормально (или даже лучше) делать это так, как я это делал ... –

+0

@ user1361466 Вот как я думаю об этом, да, хотя это, возможно, меньше ошибка и больше возможностей;) При добавлении Generics разработчики языка были настроены поддерживать обратную совместимость с предыдущими версиями Java, и как таковые (правильно или неправильно) они сделали много компромиссов с Generics. –

ответ

1

Мне пришлось дважды подумать об этом. Вот почему:

Если вы написали

<T extends Comparable<? super T>> 

это будет означать, что ваш T должен продлитьComparable. То, что вы хотите, это для него реализацияComparable.

Для этого вам необходимо расширить класс, а затем уточнить, какие интерфейсы должны быть реализованы.

Поскольку вам не нужен какой-либо специальный класс, вы должны затем продлить Object, как только это будет сделано, вы можете точно определить, какой интерфейс реализовать.

Синтаксис:

<T extends ClassToExtend & InterfaceToImplement> 
+0

Если я опускаю расширение Object, тогда T не должен быть интерфейсом, как я понимаю, но Type. Как видно из вышеприведенного комментария, проблема, похоже, заключается в совместимости с устаревшим кодом, который требует, чтобы возвращаемый тип был Object, но здесь мы получаем после стирания типа Comparable. –

+0

Не совсем. Для '>', 'T' может быть * любым * типом, интерфейсом или классом, который является или расширяет' Comparable'. – Bohemian

+0

ОК, я не знал, что класс может расширить интерфейс ... Il обновить мой ответ. – SteeveDroz