PriorityQueue
- это класс, а не объект.
myList
- объект типа PriorityQueue
с общим типом D
.
ImplementPriorityQueue
- фактический тип объекта, в данном случае подкласс PriorityQueue
.
new ImplementPriorityQueue<D>(K + 1)
вызывает экземпляр объекта, присвоенного myList
, используя конструктор с подписями ImplementPriorityQueue(int)
.
Кстати, почему вы звоните в очередь myList
? myQueue
может быть менее запутанным.
EDIT В ответ на замечание о MyList с двумя типами ...
PriorityQueue
является объявленный тип, и так это то, что ваш код будет относиться к ней как. Он имеет такие методы, как peek
, contains
и т. Д., И все они доступны для вашего кода.
ImplementPriorityQueue
- фактический тип myList. У него могут быть такие методы, как, например, explode
, makeIceCream
и т. Д., Но ваш код будет , а не, имеют доступ к этим методам, потому что он думает о myList как PriorityQueue
- и эти методы не существуют в PriorityQueue
.
Это всегда хорошая идея как можно более общая, но не более общая при создании кода. Давайте рассмотрим пример метода, который перебирает список строк и выводит значения.
public void printValues(ArrayList<String> list) {
for (String s : list) {
System.out.println(s);
}
}
Вы могли бы назвать этот метод, передавая ему ArrayList:
ArrayList<String> list = new ArrayList<>();
printValues(list);
Это будет работать нормально ... но что, если у вас также есть LinkedLists в вашем коде? Следующий код не будет компилироваться, потому что printValues
ожидает ArrayList.
LinkedList<String> list = new LinkedList<>();
printValues(list); <--- compilation error here
Способ разработки для этого заключается в использовании более общей версии как ArrayList, так и LinkedList. Оба этих класса расширяют AbstractList, поэтому мы можем изменить его на это.
public void printValues(AbstractList<String> list) {
for (String s : list) {
System.out.println(s);
}
}
Теперь мы можем передать ему LinkedLists, ArrayLists и все остальное, что расширяет AbstractList. Однако, мы можем улучшить это дальше, потому что AbstractList
- это действительно деталь реализации. Мы действительно заботимся о списках, и поэтому мы действительно должны смотреть на интерфейс, который определяет поведение типа List. Это java.util.List, и наша окончательная версия метода выглядит так.
public void printValues(List<String> list) {
for (String s : list) {
System.out.println(s);
}
}
Теперь, потому что мы работаем с определением и не фактический типа мы имеем намного более полезный метод, который будет принимать все, что реализует List
.
Это поведение называется полиморфизмом - мы можем рассматривать объект типа A как объект типа B, если между ними существует родительско-дочерняя связь. Вот почему вы можете рассматривать что-либо как объект, потому что Object является родителем всего.
Что касается вещей как можно более общих, но не более того - List
является таким же общим, как вы можете получить для списков. Вы бы не сказали, например, «ну, объект еще более общий!».
'PriorityQueue' является тип переменной. 'ImplementPriorityQueue ' - тип создаваемого объекта. –
immibis
это то же самое, что и «Object o =» test ». Сам объект - это просто суперкласс String в этом случае, где' PriorityQueue', кажется, является суперклассом «ImplementPriorityQueue» – SomeJavaGuy
, но <> не означает его Связанный список? –