我们有一个或多或少类似于以下的方法。但是我们目前返回 List ,函数 bla() 将List<Bar>
在运行时返回。
我正在寻找一种方法来使两者
List<Interface> = troubleFuction(foo, bar.getCLass());;
和
List<Bar> = troubleFuction(foo, bar.getCLass());;
可能的。基本上我希望它返回与接口兼容的 List 但这会产生以下错误
*类型不匹配:无法转换List<capture#3-of ? extends Bar>
为List<Interface>*
有什么方法可以使这种返回类型成为可能,或者运行时擦除是否使这成为不可能
public <T1 extends Interface, T2 extends Interface> List<"problem"> troubleFunction( T1 in, Class<T2> clazz) {
return in.doStuffWhichGeneratesAlistOF(clazz)
}
public void bla() {
Foo foo = new Foo(); // implements interface
Bar bar = new Bar(); // implements interface
List<Interface> ifaces = toubleFuction(foo, bar.getCLass());
List<Bar> mustAlsoWork = toubleFuction(foo, bar.getCLass());
}
编辑:在很多现有的代码库中,该方法被称为
List<Bar> result = troubleFunction(List<Interface> list, Bar.class);
因此这个返回类型必须保持兼容(重写/重构不是一个选项)
本质上我希望该方法返回 List<? super Bar>
如果调用为
troublefunction(foo, Bar.class);
当被
List<? super Foo>
称为
troublefunction(foo, Bar.class);