2013-08-10 4 views
3
class BinarySearch<T extends Comparable<? super T> > 

Почему T extends Comparable <? super T> включая T, что означает включение Comparable<T>, а не только иерархию суперкласса? Я смущен ключевым словом super, поскольку я думал, что супер будет включать только элементы суперкласса. Я новичок в java, и в Java-книге у него был следующий пример:Почему T extends Comparable <? super T> включает T? Значение включает Comparable <T>?

Это касается метода в классе, который пытался ограничить верхнюю и нижнюю границу иерархии с помощью Java.awt.Component, поэтому класс был расширяет контейнер

class CustomComponent<T extends Container> 

в классе они имеют следующий метод

void describeComponent<CustomComponent<? super JPasswordField> ref) 

, а затем продолжает говорить

Обратите внимание, что JPasswordField, являющийся суперклассом JTextField, сам опущен в списке допустимых объектов.

+0

точка выше конструкции так, что если у вас есть «класс Animal реализует Comparable ', а 'class Dog extends Animal', ограничение будет принимать« Dog », что сопоставимо со всеми« Animal's », даже если оно не сопоставимо с« Dog ». Тем не менее, вы не хотите ** предотвращать ** то - '? super T' * не предполагается * означает «* только» суперклассы «T'», но «' T' или любой из его суперклассов ». – millimoose

+2

У вас есть ссылка на документацию этого метода 'describeComponent'? Это кажется неправильным (или, возможно, искаженным), но это трудно сказать без дополнительного контекста. –

+0

Программирование на Java Автор: Poornachandra Sarang Издатель: McGraw-Hill Паб. Дата: 20 января 2012 г. Печать ISBN-13: 978-0-071-63360-4 E-Book ISBN-13: 978-0-071-63361-1 Страницы в Печатное издание: 672 – bjackfly

ответ

7

С Lower Bounded Wildcards, сечение Generics секции The Java Tutorial:

... ограничены снизу подстановочные ограничивает неизвестный тип быть определенный тип или супер тип этого типа.

(жирный шрифт мое, внимание их)

Таким образом, множество классов, которые соответствуют T extends Comparable<T> является подмножеством из множества классов, которые соответствуют T extends Comparable<? super T>. Подстановочный знак ? super T сам соответствует T и любым суперклассам T.

Другими словами, предположение, что «super будет включать только предметы суперкласса», является просто неправильным.

Ваше замешательство в примере, может также возникнуть из-за того, что JTextField является суперкласс из JPasswordField; другими словами, JPasswordField extends JTextField. Пример будет соответствовать любому из следующих классов:

  • javax.swing.JPasswordField
  • javax.swing.JTextField
  • javax.swing.JTextComponent
  • javax.swing.JComponent
  • Java. awt.Container
  • java.awt.Component
  • java.lang.Объект

пример будет гораздо больше смысла, как:

void describeComponent(CustomComponent<? super JTextField> ref) {...} 

Обратите внимание, что JPasswordField, который является подклассом JTextField, само по себе является опущена в списке допустимых объектов, потому что это не суперкласс JTextField.

+0

Это имеет смысл, поэтому в вашем примере включен JTextField, но не JPasswordField, поскольку он расширяет JTextField. Это дает больше смысла для разъяснения. Я думаю, что было непонятно, что их определение «супер» кажется гораздо более логичным. Спасибо. – bjackfly

3

Я считаю, что семантическое значение «< T расширяет Сопоставимые <? Супер T > >» что либо T или суперкласс T должен реализовать Comparable

+0

Это верно Тони Коко. – Victor

Смежные вопросы