2009-05-26 123 views
3

我们有一个或多或少像下面这样的方法。 但是我们现在返回列表 ,它在函数bla()中将在运行时返回List<Bar>从泛型函数返回泛型类型

我正在寻找一种方法,使双方

List<Interface> = troubleFuction(foo, bar.getCLass());; 

List<Bar> = troubleFuction(foo, bar.getCLass());; 

可能。 basicaly我希望它返回的是与接口兼容列表 然而,这提供了以下错误

*类型不匹配:不能从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); 

因此该返回类型必须保持兼容(重写/重因子不是一个选项)

基本上我想的方法,如果称为

troublefunction(foo, Bar.class); 

List<? super Foo>时返回列表<? super Bar>叫做

troublefunction(foo, Bar.class); 
+0

在Java中,函数被称为方法。 – eleven81 2009-05-26 14:50:42

+0

接口不是保留字? – 2009-05-26 14:56:19

回答

1

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

但是看起来您已经在您的案例中完成了这项工作,因此troubleFunction将被宣布返回List<T2>?或者,如果你想保持一般,那么它会返回List<? extends Interface>

0

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

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

其中

public <T extends Interface> List<T> troubleFunction(
    T in, Class<? extends T> clazz 
) { 
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)的结果,则可能必须使该方法的返回类型也是通用的。但我不能真正帮助你,因为我们没有任何有关该方法的信息。

0

我在此再次看了一下,问题是,我想用“超级”的返回类型 签名我一直在寻找或多或少:

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

,这是不可能