は無制限のタイプであるt.g(u)
ため、そのまま呼び出すことはできません。T
コンパイラが使用可能なメソッドを認識できるように、コンパイル時の制限を設定する必要があります。Object
そうしないと、コンパイラが推測できるのT
はextendsだけなので、メソッドを呼び出すことしかできませんObject
。
たとえば、呼び出したいメソッドG<U>
とのインターフェースがある場合:g
public interface G<U> {
R g(U u);
}
次にT extends G<U>
、それを指定します。これにより、を呼び出すことができますg()
。そして今、あなたはのリターンタイプが何であるかを知っていますg()
:それはですR
。
public class C1<T extends G<U>, U> {
public R f(T t, U u) {
return t.g(u)
}
}
結果を型にg()
依存させたい場合は、次のようにすることができます。T
U
public interface G<T, U> {
T g(U u);
}
public class C1<T, U> {
public T f(G<T, U> g, U u) {
return g.g(u)
}
}