class Test { public static Test left(P p) { return null; } public static Test right(Q q) { return null; } public C either(Function leftFn, Function rightFn){ return null; } public Test swap() { return either(Test::right, Test::left); } } interface Function { R fun(T t); }