0

我正在尝试将具体类列表的未来转换为接口列表的未来,但是当我尝试它时出现“不兼容的类型”错误。基本上我的代码看起来像这样

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

public void doStuffWithInterface(Future<List<InterfaceClass>>)
{
   blah();
}

有没有一种好方法可以在不将 getFutureStuff 签名更改为

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

并乱扔我的代码?扩展接口类。

4

2 回答 2

3

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
于 2013-09-12T21:56:09.183 回答
1

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

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

因此,它使仅ConcreteClasses 的列表包含不兼容的类型。

简单的例子:

public void addStuff(List<Number> l) {l.add(1.5);}

List<Integer> l = new ArrayList<>();
addStuff(l);
for(Integer i : l) {}// class cast exception!
于 2013-09-12T21:40:52.597 回答