Как мне параметризовать расширенную коллекцию - PullRequest
4 голосов
/ 24 марта 2009

Я пытался расширить класс ArrayList без особого успеха. Я хочу расширить его и уметь его параметризировать.

Так что обычно у вас есть что-то вроде

ArrayList<SomeObject> list = new ArrayList<SomeObject>();

хочу

MyList<SomeObject> list = new MyList<SomeObject>();

Простое расширение ArrayList не работает.

public class MyList extends ArrayList ...

Когда я пытаюсь использовать его, я получаю сообщение об ошибке

Тип MyList не является универсальным; Это не может быть параметризован с аргументами

Я пробовал варианты

public class MyList extends ArrayList<Object>
public class MyList<SubObject> extends ArrayList<Object>

безуспешно, если я использую подобъект за именем класса, он, кажется, работает, но по какой-то причине скрывает методы в классе подобъекта.

Будем благодарны за любые мысли или предложения о том, как правильно работать.

Ответы [ 3 ]

12 голосов
/ 24 марта 2009

Вам необходимо указать тип для параметра типа ArrayList. Для параметров универсального типа T довольно распространено. Поскольку компилятор не знает, что такое T, вам необходимо добавить параметр типа к MyList, который может передавать тип. Таким образом, вы получаете:

public class MyList<T> extends ArrayList<T>

Кроме того, вы можете рассмотреть возможность реализации List и делегирования ArrayList, а не наследования от ArrayList. «Воспользуйтесь композицией объектов, а не наследованием классов. [ Шаблоны проектирования стр. 20]»

3 голосов
/ 24 марта 2009
public class MyList<T> 
    extends ArrayList<T>
{
}

MyList<SomeObject> list = new MyList<SomeObject>();

или

public class MyList
    extends ArrayList<SomeObject>
{
}

MyList list = new MyList();
1 голос
/ 24 марта 2009

Вы не должны расширять ArrayList, расширять AbstractList вместо:

public class MyList<T> extends AbstractList<T> {
    public int size() {...}
    public T get(int index) {...}
}
...