2016-04-08 8 views
0

弱い推論の問題を、以下のコードで追加の変数や型キャストを定義することなく解決できますか?汎用メソッドの型推論の問題

public class GenericClass<T> { 
    public <R> R m(Class<R> cl) { 
     return null; 
    } 
} 

GenericClass<SomeClass> v2 = new GenericClass<SomeClass>() 
    .m(GenericClass.class) 
    .m(GenericClass.class); // <- Object cannot be converted to GenericClass<SomeClass> 

答えて

3

はい:

public class GenericClass<T> { 
    public <R> R m(Class<? super R> cl) { 
     return null; 
    } 
} 

GenericClass<SomeClass> v2 = new GenericClass<SomeClass>() 
    .<GenericClass<SomeClass>>m(GenericClass.class) 
    .m(GenericClass.class); 

我々はclが消去タイプ(すなわち、ジェネリック型、Rのスーパータイプ)であるかもしれないという事実を修正する必要があり、その後、私たちが伝える必要がありますコンパイラは実引数Rを引数としているのは、引数がスーパー型しか示していないからです。

mへの2回目の呼び出しでは、割り当てから推測されるため、指定された汎用タイプを持つ必要はありません。

+0

genericクラスは、私が変更できないサードパーティのライブラリクラスです。とにかくありがとう。 –

+0

あなたはキャストする必要があります。 –

0

チェーン内でメソッドmを呼び出すには、クラス "this"を返す必要があります。あなたのケースではGenericClassです。これはうまくいくはずです。

class GenericClass<T> { 
    public <R> GenericClass<T> m(Class<R> cl) { 
     // code to do something here 
     return this; 
    } 
} 

"m"メソッドを呼び出すたびに、それ自身のクラスが返されますので、もう一度呼び出すことができます。

私は役立つことを願っています。