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

Java 重用泛型类型T扩展特定类,java,generics,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 m

我想使用一个
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)
    }
}
公共类Foo扩展了AbstractFoo{
private ArrayList list=new ArrayList();
@凌驾
公共空间添加(可比e){
list.add(e);//类型ArrayList中的方法add(T)不适用于参数(Compariable)
}
}

为什么我不能将
e
添加到
列表中
?由于T扩展了Comparable,我想我可以将
e
添加到
列表中
让我们假设您有一个类
教师
和一个类
学生
,这两个类都实现了
Comparable
。现在,如果您创建一个
Foo
,这个Foo对象将包含一个教师列表
ArrayList
。如果您的代码可以编译,您现在可以将一个学生(因为它是可比较的)添加到教师列表中,这当然是不允许的

实际上,您可能想要:

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

由于所有
T
s都是
可比的
,但并非所有
可比的
都是
T
s,因此不能将
可比的
添加到
T
列表中

不过,您可以通过使用
ArrayList
来实现这一点

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); 
    }
}
公共类Foo扩展了AbstractFoo{
private ArrayList list=new ArrayList();
@凌驾
公共空间添加(可比e){
列表.添加(e);
}
}

这只起作用,因为
Comparable
是原始类型。在这种情况下,add方法会污染
列表
,使其具有任意可比性。True。最好将方法参数更改为
Comparable e
。但我觉得这可能超出了这个问题的范围