Я просто учусь до дерева и одной вещи, которую я не понимаю об этом, объявление класса:
например: класс BinarySearchTree<T extends Comparable<? super T>>
.
Теперь, можно ли объяснить меня, что находится в скобке и"<? super T>
"?
Какой-либо хороший источник можно ли отослать меня к?Спасибо.
Объявляется класс с одним общим параметром типа. Так как для дерева двоичного поиска крайне важно, чтобы оно могло сравнивать два элемента, то это нужно указать, чтобы компилятор мог это проверить.
Часть в угловых скобках является параметром типа T
и ограничением для него, которое гласит:
T
, оно должно расширять Comparable
(>
). <сопоставимый
должен быть в состоянии сравнить себя либо с T
, либо с супер-классом T
( супер T>
). Поскольку T
обычно может быть чем угодно, что ограничивает выбор типов, для которых имеет смысл реализовать дерево поиска.
супер T>
средства это ?
родитель T
. Если ?
известен (например X
), можно использовать
РЕДАКТИРОВАНИЕ : Это - хороший источник для Универсального Java: http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
Учебное пособие солнца - это хорошее место для начала изучения подстановочных знаков и дженериков.
Java Ranch также очень хорошо для Java "Greenhorns".
Скобки <> предназначены для того, что называется дженериками. Это очень похоже на шаблон в C++ и позволяет создать единую структуру данных, которая может быть сильно напечатана. Например, объект ArrayList использует дженерик для определения типа элементов в ArrayList:
ArrayList<String> - an ArrayList containing Strings
ArrayList<MyClass> - an ArrayList containing MyClass objects
Когда вы определяете структуру, использующую дженерики, которые вы используете для обозначения выше. T" - это место для некоторого класса, которое заполняется, когда класс инстанцируется и ему присваивается тип. Например, определение ArrayList может выглядеть следующим образом:
public class ArrayList<T> ...
Самый простой способ - это просто использовать MyGeneric
и позволить использовать любой класс. Однако, иногда вы хотите, чтобы герика использовалась только с классами в определенной структуре наследования. В этом конкретном случае Comparable super T>
означает, что это будет объект, который расширяет Comparable the Compares any type of object, который соответствует T или является супер-классом T.
Фраза Super T>
- это подстановочный знак и подразумевает, что класс Binarysearchtree может принимать:
a. Параметр типа (T), который расширяется сопоставимым
б. А также может взять подтип (ы), родитель которого расширяется сопоставимым
конструкции Super T>
расширяет утилиту класса Binarysearchtree
Тип (ы), которые реализуются сопоставимы и его подтипы.
Ниже, фрагмент кода демонстрирует это:
// Below declaration of Helper class doesn't uses the wildcard super
class Helper<T extends Comparable<T>> {
// some helper methods
}
abstract class Animal implements Comparable<Animal> {
public int compareTo(final Animal o) {
// implementation ...
}
// other abstract methods
}
class Mammal extends Animal {
// implement abstract methods
}
С вышеуказанной декларацией заявление Helper <113200]
работает нормально.
Но утверждение: Helper
дает ошибку компиляции
Тип параметра млекопитающее не находится в пределах его
(версия компилятора javac 1.5.0_06 )
Когда декларация класса Helper изменяется на ниже форму:
class Helper<T extends Comparable<? super T>> {
// some helper methods
}
Тогда заявление Helper
не дает никакой ошибки компилятора.
При этом использование подстановочного знака максимизирует полезность класса.