Java泛型将具体类列表的未来转换为接口列表的未来?

Java泛型将具体类列表的未来转换为接口列表的未来?,java,generics,Java,Generics,我试图将未来的具体类列表转换为未来的接口列表,但在尝试时遇到了“不兼容类型”错误。基本上我的代码是这样的 public void main() { Future<List<ConcreteClass>> future = getFutureStuff(); doStuffWithInferface(future); // Syntax Error! } public void doStuffWithInterface(Future<List<In

我试图将未来的具体类列表转换为未来的接口列表,但在尝试时遇到了“不兼容类型”错误。基本上我的代码是这样的

public void main()
{
   Future<List<ConcreteClass>> future = getFutureStuff();
   doStuffWithInferface(future); // Syntax Error!
}

public void doStuffWithInterface(Future<List<InterfaceClass>>)
{
   blah();
}
public void main()
{
Future=getFutureStuff();
doStuffWithInferface(未来);//语法错误!
}
公共无效doStuffWithInterface(未来)
{
诸如此类;
}
有没有一种好方法可以在不将GetFutureTuff签名更改为的情况下更改此项

public Future<? extends List<? extends InterfaceClass>> getFutureStuff();

公共未来是的,你应该这样做。假设你有:

public void doStuffWithInterface(Future<List<InterfaceClass>> f)
{
   List<InterfaceClass> list = f.get();
   list.add(new AnotherConcreteClassWhichImplementsTheInterface());// it will fail if you use "? extends"
}

是的,你应该这样做。假设你有:

public void doStuffWithInterface(Future<List<InterfaceClass>> f)
{
   List<InterfaceClass> list = f.get();
   list.add(new AnotherConcreteClassWhichImplementsTheInterface());// it will fail if you use "? extends"
}

getFutureStuff
可以保持不变,但您应该更改
doStuffWithInterface
的签名,因为未来将以协变方式使用:

public void doStuffWithInterface(
        final Future<? extends List<? extends InterfaceClass>> future
) throws InterruptedException, ExecutionException {
    final List<? extends InterfaceClass> list = future.get();
    for (final InterfaceClass element : list) {
        //use element
    }
}

...

Future<List<ConcreteClass>> future = getFutureStuff();
doStuffWithInferface(future); // perfectly fine
public void doStuffWithInterface(

最终未来
getFutureStuff
可以保持不变,但您应该更改
doStuffWithInterface
的签名,因为未来是协变使用的:

public void doStuffWithInterface(
        final Future<? extends List<? extends InterfaceClass>> future
) throws InterruptedException, ExecutionException {
    final List<? extends InterfaceClass> list = future.get();
    for (final InterfaceClass element : list) {
        //use element
    }
}

...

Future<List<ConcreteClass>> future = getFutureStuff();
doStuffWithInferface(future); // perfectly fine
public void doStuffWithInterface(

最终的未来
list.add(接口的子类型)
将成功。失败的是将list分配给list的引用在玩了一点之后,我想我明白了。从java的角度来看,问题是“如果以后有人将错误的类型添加到列表中怎么办?”…好吧,这很糟糕,因为列表是不可变的,但是,不管怎样,我想我会开始注释所有的东西。@Cogman是的,你是对的,“?”extends”使列表是不可变的。有点冗长的语法…但java一直是一种冗长的语言。
list.add(接口的子类型)
将成功。失败的是将列表分配给列表的引用。我想我玩了一会儿后就明白了。从java的角度来看,问题是“如果有人稍后将错误的类型添加到列表中怎么办?”…好吧,这很糟糕,因为列表是不可变的,但是,不管怎样,我想我会开始注释所有的东西。@Cogman是的,你是对的,“?”extends”使列表是不可变的。有点冗长的语法…但java一直是一种冗长的语言。