2009-05-26 11 views
3

から返します。以下のような方法があります。 しかし、私たちは現在、リスト を返しますが、関数bla()は実行時にList<Bar>を返します。ジェネリック関数を汎用関数

私は両方

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

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

を可能にする方法を探しています。私は、それはインタフェースと互換性があるでしょうリストを返すようにしたい basicalyが しかし、これは次のようなエラーになります

*型の不一致は:可能この戻り値の型を作るためにどのような方法があるList<Interface>*

List<capture#3-of ? extends Bar>から変換することはできませんか既存のコードベースの多くで 方法が

のように呼ばれている:実行時の消去は、この不可能

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

+0

インターフェイスは予約語ではありませんか? –

+0

ifaceはリストであるはずですか? –

答えて

1

一般的に言えば、このような状況では、 o戻り値として使用されるClassオブジェクト(明示的にパラメータ化されたもの)を明示的に渡します。

しかし、あなたの場合は既にこれを行っているようですので、troubleFunctionList<T2>を返すと宣言されていませんか?また、一般的なままにしたい場合は、List<? extends Interface>を返すようにしてください。

0

私が理解しているように、引数型は、汎用型の引数を推論するためにターゲット型の前で調べられます。だから、私はあなたが明示的に私が思う一般的な引数を指定する必要があると思いますが、このような何かを行く:

public <T extends Interface> List<T> troubleFunction(
    T in, Class<? extends T> clazz 
) { 
1

あなたは私たちに本当に必要なものを伝えるために十分な情報を与えていない

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

する。たとえば、タイプシグネチャ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

in関数は、foo.doStuffWhichGeneratesAlistOF(Bar.class)として呼び出されたときに、クラスBarのインスタンスのリストを返します。 – pvgoddijn

0

私は再びこの見てきたし、問題は私が探していた「スーパー」戻り値の型 署名を使用したいということであった多かれ少なかれ:ことはできません

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

関連する問題