你可以聲明泛型方法與遞歸類型定義
<G extends Function<G, IntUnaryOperator>> IntUnaryOperator g(G g) {
return g.apply(g);
}
什麼也不行,是調用此方法lambda表達式,分配lambda表達式G
。 The specification說
15.27.3。一個Lambda表達式的類型
lambda表達式是在分配上下文,調用上下文,或與目標類型T鑄造上下文兼容如果T是一個功能接口類型(§9.8)...
和G
被不是一個功能接口,而是一個類型參數,並且無法在此處推斷出G
的實際接口類型。
還是能夠工作,當你實際使用的接口G
的lambda表達式:
IntUnaryOperator Y(Function<IntUnaryOperator, IntUnaryOperator> f) {
return g((G)g -> f.apply(x -> g.apply(g).applyAsInt(x)));
}
// renamed the type parameter from G to F to avoid confusion
<F extends Function<F, IntUnaryOperator>> IntUnaryOperator g(F f) {
return f.apply(f);
}
// can't get rid of this interface
interface G extends Function<G, IntUnaryOperator> {/**/}
或
IntUnaryOperator fact = Y(rec -> n -> n == 0 ? 1 : n * rec.applyAsInt(n - 1));
IntUnaryOperator Y(Function<IntUnaryOperator, IntUnaryOperator> f) {
return this.<G>g(g -> f.apply(x -> g.apply(g).applyAsInt(x)));
}
// renamed the type parameter from G to F to avoid confusion
<F extends Function<F, IntUnaryOperator>> IntUnaryOperator g(F f) {
return f.apply(f);
}
// can't get rid of this interface
interface G extends Function<G, IntUnaryOperator> {/**/}
所以該方法g
是通用的,沒有依賴於界面G
,但該接口仍然需要用作lambda表達式的目標類型。
我很確定這是不可能的。 Java沒有提供一種方法來要求給定的泛型參數是一個功能接口AFAIK。 – Ryan