Подтвердить что ты не робот

Можете ли вы расширить ArrayList на Java?

Можно ли создать дочерний класс, который расширяет ArrayList? Если да, то как?

4b9b3361

Ответ 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.