Скажем, у вас есть класс со следующим методом
public ArrayList<T> foo (ArrayList<T> someInput) {
//Do some operations on someInput here...
return someOutput;
}
Теперь, что произойдет, если изменить программу таким образом, что он использует LinkedList
объекты вместо ArrayList
объектов? Вы получите ошибку компилятора везде, где этот метод вызывается, и вам придется пройти и реорганизовать свой код, чтобы он принимал объекты LinkedList
.
Если вы запрограммировали на интерфейс и использовать список вместо:
public List<T> foo (List<T> someInput) {
//Do some operations on someInput here....
return someOutput;
}
Если бы это было так, то не рефакторинга не было бы необходимости в оба LinkedList
и ArrayList
классы реализуют List
, так что не было бы никакой компилятор ошибки. Это делает его невероятно гибким. Не имеет значения для метода, в котором он принимает и что он возвращает, до тех пор, пока объекты реализуют интерфейс List. Это позволяет вам определять поведение, не подвергая ни одной из основных реализаций.
причина полиморфизм – gjman2
я ждал этого, чтобы взорваться: D – MadProgrammer
возможно дубликат http://stackoverflow.com/questions/4062982/java-oop-list-versus-arraylist-as-reference-type –