我们有一个或多或少类似于以下的方法。
但是我们目前返回列表
在函数 bla() 中会返回 List<Bar>
在运行时。
我正在寻找一种方法使两者兼而有之
List<Interface> = troubleFuction(foo, bar.getCLass());;
和
List<Bar> = troubleFuction(foo, bar.getCLass());;
可能。 基本上我希望它返回与接口(interface)兼容的列表 然而,这会产生以下错误
*类型不匹配:无法从 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);
因此这个返回类型必须保持兼容(重写/重构不是一个选项)
本质上,我希望该方法返回列表 <? super Bar>
如果调用为
troublefunction(foo, Bar.class);
和
List<? super Foo>
当被称为
troublefunction(foo, Bar.class);
最佳答案
一般来说,在这种情况下,您需要显式传递一个 Class 对象(一般参数化),用于返回值。
但是看起来您已经在您的案例中完成了此操作,所以它不适用于 troubleFunction
待申报返回List<T2>
?或者,如果你想让它保持通用,那么让它返回 List<? extends Interface>
.
关于java - 从泛型函数返回泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/911104/