java - 从泛型函数返回泛型类型

标签 java generics super return-type

我们有一个或多或少类似于以下的方法。 但是我们目前返回列表 在函数 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/

相关文章:

java - 了解 spring 4 (spring-context) maven 依赖

java - 使用 Java Runtime.getRuntime().exec 调用 aspell 程序的字符集问题

java - 对于 Java 中的静态帮助器类,使用泛型还是对象类型更好?

c# - Curiously Recurring Template Pattern 和泛型约束 (C#)

java - 何时使用 super.render(); super.dispose();super.pause();和 super.resize(w,h);在 Libgdx 中?

python - 收到错误消息说 super 需要 1 个参数,但给出了 0 个参数?

java - 我的数组列表仅在一行中输出?

c# - 我可以在 C# 中创建求和的通用方法吗

java - 下面的命令中 super 和 this 之间的区别?

java - Sonar 提示局部变量的无用分配