2017-01-26 4 views
2

Я хотел бы использовать ArrayList, который содержит элементы типа, заданного классом.Повторное использование общего типа T, расширяющего определенный класс

public class Foo<T extends Comparable<T>> extends AbstractFoo { 

    private ArrayList<T> list = new ArrayList<T>(); 

    @Override 
    public void add(Comparable e) { 
     list.add(e); // The method add(T) in the type ArrayList<T> is not applicable for the arguments (Comparable) 
    } 
} 

Почему я не могу добавить e к list? Поскольку T определенно расширяет Comparable, я полагаю, я могу добавить e в list.

ответ

2

Предположим, у вас есть класс Teacher и класс Student, которые оба реализуют Comparable. Теперь, если вы создадите Foo<Teacher>, этот объект foo будет содержать список учителей ArrayList<Teacher>. Если ваш код будет компилироваться, теперь вы можете добавить ученика (потому что он сопоставим) с списком учителей, который, конечно, не разрешен.

Вы могли бы на самом деле хотите:

@Override 
public void add(T e) { 
    list.add(e); 
} 
1

Потому что все T s являются Comparable, но не все Comparables являются T s вы не можете добавить Comparable в список T.

Вы можете сделать это, имея ArrayList<Comparable<T>> хотя

public class Foo<T extends Comparable<T>> extends AbstractFoo { 

    private ArrayList<Comparable<T>> list = new ArrayList<>(); 

    @Override 
    public void add(Comparable e) { 
     list.add(e); 
    } 
} 
+0

это работает только потому, что 'Comparable' является исходным типом. Тип метода добавления загрязняет «List >» с произвольными сопоставимыми в этом случае. – Calculator

+0

Правда. Было бы лучше изменить параметр метода на 'Comparable e'. Но я чувствую, что может оказаться вне сферы действия этого вопроса –