3

我们有一个或多或少类似于以下的方法。但是我们目前返回 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);
4

4 回答 4

1

你没有给我们足够的信息来真正告诉你需要做什么。例如,您没有给我们类型签名doStuffWhichGeneratesAlistOF()或告诉我们它的作用。而且你没有告诉我们 " in" 参数的类型与所有这些有什么关系。

当然,方法的返回类型可以是泛型的例如,

public <T extends Interface> List<T> troubleFunction(Interface in, Class<? extends T> clazz) {
  List<T> result = new ArrayList<T>();
  result.add(clazz.newInstance());
  return result;
}

然后您可以像这样直接调用该方法并且它会起作用(您不需要显式指定类型参数,因为它是从赋值中推断出来的):

List<Interface> iface = this.troubleFunction(foo, bar.getCLass());

但是看到你在上面的代码中如何返回结果in.doStuffWhichGeneratesAlistOF(clazz),你可能还必须使该方法的返回类型也通用。但我真的无法帮助你,因为我们没有关于该方法的任何信息。

于 2009-05-26T18:19:11.953 回答
1

一般来说,在这种情况下,您需要显式传递一个用于返回值的 Class 对象(一般参数化)。

但是,在您的情况下,您似乎已经这样做了,所以troubleFunction被宣布返回是否行不通List<T2>?或者,如果你想让它保持一般性,那么让它 return List<? extends Interface>

于 2009-05-26T14:53:11.277 回答
0

我又看了一遍,问题是我想使用“超级”返回类型,我正在寻找的签名或多或少:

 public <T1 extends interface, T2 super T1> List<T2> getAList(Class<T1> clazz); 

这是不可能的

于 2009-10-16T10:32:09.183 回答
0

据我了解,在目标类型之前查看参数类型以推断通用参数。所以,我想你需要明确指定泛型参数,我认为它是这样的:

List<Interface> iface = this.<Interface>troubleFunction(foo, bar.getCLass());

在哪里

public <T extends Interface> List<T> troubleFunction(
    T in, Class<? extends T> clazz
) {
于 2009-05-26T15:00:00.140 回答