Как мне параметризовать расширенную коллекцию
-
21-08-2019 - |
Вопрос
Я пытался расширить класс ArrayList без особого успеха.Я хочу расширить его и иметь возможность параметризовать.
Итак, обычно у вас есть что-то вроде
ArrayList<SomeObject> list = new ArrayList<SomeObject>();
Я хочу
MyList<SomeObject> list = new MyList<SomeObject>();
Простое расширение ArrayList не работает.
public class MyList extends ArrayList ...
Когда я пытаюсь его использовать, я получаю сообщение об ошибке
Тип myList не является универсальным;это не может быть параметризовано с помощью аргументов <SomeObject>
Я пробовал вариации
public class MyList extends ArrayList<Object>
public class MyList<SubObject> extends ArrayList<Object>
безуспешно, если я использую подобъект за именем класса, кажется, что он работает, но по какой-то причине скрывает методы в классе подобъекта.
Любые мысли или предложения о том, как заставить это работать правильно, приветствуются.
Решение
Вам необходимо указать тип для ArrayList
параметр типа s.Для параметров универсального типа, T
является довольно распространенным явлением.Поскольку компилятор не знает, что такое T
то есть вам нужно добавить параметр типа в MyList
в котором может быть передан тип.Таким образом, вы получаете:
public class MyList<T> extends ArrayList<T>
Кроме того, вы можете рассмотреть возможность внедрения List
и делегирование полномочий ArrayList
, вместо того , чтобы наследовать от ArrayList
."Отдавайте предпочтение композиции объектов, а не наследованию классов.[Шаблоны проектирования стр.20]"
Другие советы
public class MyList<T>
extends ArrayList<T>
{
}
MyList<SomeObject> list = new MyList<SomeObject>();
или
public class MyList
extends ArrayList<SomeObject>
{
}
MyList list = new MyList();
Вам не следует расширять ArrayList, расширяйте Абстрактный список вместо этого:
public class MyList<T> extends AbstractList<T> {
public int size() {...}
public T get(int index) {...}
}