重用泛型类型T扩展特定类

时间:2017-01-26 10:28:19

标签: java generics

我想使用包含该类指定类型元素的ArrayList

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 个答案:

答案 0 :(得分:2)

假设您有一个类Teacher和一个类Student,它们都实现了Comparable。现在,如果您创建Foo<Teacher>,则此foo对象将包含教师列表ArrayList<Teacher>。如果你的代码会编译,你现在可以添加一个学生(因为它可以比较)给老师名单,当然这是不允许的。

您可能真的想要:

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

答案 1 :(得分:1)

由于所有T都是Comparable,但并非所有Comparables都是T,因此您无法将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); 
    }
}