は無制限のタイプである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()依存させたい場合は、次のようにすることができます。TU
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)
}
}