2009-03-23 2 views
4

Я пытался расширить класс 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> 

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

Любые мысли или предложения о том, как получить право на работу, оцениваются.

ответ

12

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

public class MyList<T> extends ArrayList<T> 

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

3
public class MyList<T> 
    extends ArrayList<T> 
{ 
} 

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

или

public class MyList 
    extends ArrayList<SomeObject> 
{ 
} 

MyList list = new MyList(); 
1

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

public class MyList<T> extends AbstractList<T> { 
    public int size() {...} 
    public T get(int index) {...} 
} 
Смежные вопросы