- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
public void playersListClearBlacklist() {
List<Player> itemsToRemove = new ArrayList<Player>();
for (int i = 0; i < blacklist.size(); i++) {
Player player = blacklist.get(i);
itemsToRemove.add(player);
DBCore.getInstance().deletePlayer(player);
}
blacklist.removeAll(itemsToRemove);
}
вут? он об интерфейсе говорит. а как же полиморфизм?
Да, тут всё от типа переменной зависит.
А вот при вызове метода важен *объект* (все методы как-бы виртуальные) а не тип указателя на этот объект.
В отличии, например, от с#, c++ итд
Если бы мы не морочили голову компилятору и прямо так и сказали: "да не List это, а ArrayList", он бы сразу знал какой из методов надо вызвать. А так ему прийдется (возможно) отложить это решение до непосредственного вызова. Я слышал где-то, что компилятор Явы может сам сузить тип до конкретного и выбрать нужный метод еще на этапе компиляции, но не уверен в этом.
На этапе компиляции - всяко нет. У джавы компилятор очень тупой и дословный. А вот JIT, емнип, может (если видит, что в эту переменную положили именно ArrayList и ничего другого не засунут).
В принципе даже и если и делает, то я не уверен что виртуальный диспатчинг это реально боттлнек джавы)) у нее полно иных боттлнеков.
---
Мне кстати НЕ нравится что методы в джаве виртуальны. Это усложняет проектирование красивого наследования. Почему-то сановцы решили что это сложно-и-ненужно (как и множественное наследование , как и перегрузку операторов итд). Хорошо что в C# это не так.
Я так же не настаиваю на том, что это сильно повлияет на производительность. Смысл в том, что в случае когда конкретный тип известен и защищен областью видимости функции, то использовать интерфейс для этого просто глупо, т.как совсем ничего не дает. Ну и в редких случаях можно наверное нарваться на таблицу с дофига методов, так что это таки отразится на производительности. Совсем недавно попадалась статья Одерски о рекордной невымышленой иерархии наследования включавшей 36 уровней, а если там еще и родственники по материнской линии были, то так и до сотни недолго добраться.
Вроде бы jit умел в таких случаях делать невиртуальный вызов метода конкретного класса.