Можно ли создать дочерний класс, который расширяет ArrayList? Если да, то как?
Можете ли вы расширить ArrayList на Java?
Ответ 1
Вы можете расширить любой класс, который не является final в Java. Сказав это, вы должны избегать наследования, если нет отношения true is-a. Рассмотрим композицию для повторного использования. Читайте о Принцип подстановки Лискова
Ответ 2
Да, вы можете.
public class MyArrayList<E> extends ArrayList<E>
{
}
Однако я не уверен, почему вы хотели бы это сделать.
Ответ 3
Как и многие другие, да, вы можете расширить класс ArrayList
, но это не то, что вы обычно должны делать; это не считается хорошей практикой в Java.
Я в основном программист на Java, но в последние месяцы я также работал над кодом С#. Похоже, что это распространенная идиома в С# для расширения стандартных классов коллекции, если вам нужна коллекция определенного типа (я действительно не знаю, является ли это общей идиомой вообще - по крайней мере, люди, которые написали код я ' m работает с этим все время).
Итак, если у них есть класс Person
, и им нужен список лиц, они должны создать класс PersonList
, который расширяет эквивалент С# ArrayList<Person>
.
Общая идиома в Java просто должна была бы использовать ArrayList<Person>
, если вам нужен список объектов Person
, а не для создания определенного подкласса для этого.
Я бы посоветовал вам придерживаться общепринятого Java-способа делать вещи, а не создавать свои собственные подклассы ArrayList
или других классов коллекций.
Ответ 4
Да, ArrayList не final
. Используйте этот подход.
class Foo<T> extends ArrayList<T>
Ответ 5
import java.util.ArrayList;
public class MyArrayList<T> extends ArrayList<T> {
//Add extra or override methods here...
}
Ответ 6
Почему бы и нет?
import java.util.ArrayList;
public class Foo<T> extends ArrayList<T> {
// ...
}
Ответ 7
ArrayList не является окончательным классом и предоставляет публичный конструктор, поэтому технически он может быть расширен.
Но лучше всего использовать делегат, а не расширять. См. Декоратор
Ответ 8
Просто попробуйте. Класс не является окончательным, он конструктор является общедоступным, поэтому вы можете. Однако, это, вероятно, не очень хорошая идея для новичков.
В большинстве случаев это нехорошая идея для всех. Представьте, что вы добавили некоторые функции и получите ExtList1 extends ArrayList
. Ваш колледж добавляет другую независимую функциональность, поэтому у вас есть ExtList2 extends ArrayList
. Теперь вы хотите их обоих сразу, и вам не повезло.
Или вам нужна такая же функция с другой реализацией базового списка (возможно, LinkedList
, хотя практически всегда неправильно использовать его). Опять же, не повезло.
Это все случаи, когда делегирование выигрывает. Не нужно быть более подробным, если кто-то уже создал базу.
Я бы только наследовал от ArrayList
, если была очень хорошая причина для этого. Возможно, некоторые действительно экстремальные требования к производительности, основанные на правильных тестах JMH.