Java泛型 - 使用实现接口的元素列表

Chr*_*ian 4 java generics interface generic-list

在Java中我有一个interface I,一个class C和一个class D,都实现I:

interface I
{
    //some method signatures
}

class C implements I
{
    //implement methods from I
}

class D implements I
{
    //implement methods from I
}
Run Code Online (Sandbox Code Playgroud)

现在我创建一个List持有元素class C,以及第二个List持有元素D:

List<C> c = new LinkedList<C>();
List<D> d = new LinkedList<D>();
Run Code Online (Sandbox Code Playgroud)

我有一个方法,我想应用于所有持有元素实现的列表interface I:

public void modifyList(List<I> l)
{
    //call some method defined in I
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试调用该函数时,编译器会抛出一个错误:

public void testModification()
{
    modifyList(c);
    modifyList(d);
}

==> The method modifyList(List<I>) in the type [...] is not applicable for the arguments (List<C>) / (List<D>)
Run Code Online (Sandbox Code Playgroud)

我可以通过重新定义我的列表来使其工作,以便它可以读取

List<I> c1 = new LinkedList<I>();
Run Code Online (Sandbox Code Playgroud)

但是现在c1可以从C和D类中保存Elements,这是我想要避免的.如何创建一个List,以便我可以准确定义它应该保持哪个类的元素,但仍然将它用作我的函数的参数?

Bre*_*eze 8

你可以尝试使用

public void modifyList(List<? extends I> l) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

类型应该是通配符,意思是任何类型,只要它的超类是(...),或者在本例中是I类.