/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
interface Foo {
void foo();
}
interface Bar {
void bar();
}
interface FooBar extends Foo, Bar {
public static FooBar combine(Foo f, Bar b) {
return new FooBar() {
public void foo() { f.foo(); }
public void bar() { b.bar(); }
};
}
}
class Parent {
protected String neededByFoo
= "foo"; protected String neededByBar
= "bar";
public void fooA() {
System.
out.
println(neededByFoo
+ "A"); }
public void fooB() {
System.
out.
println(neededByFoo
+ "B"); }
public void barA() {
System.
out.
println(neededByBar
+ "A"); }
public void barB() {
System.
out.
println(neededByBar
+ "B"); }
public static void main
(String[] args
) { Parent p = new Parent();
foobar(FooBar.combine(p::fooA, p::barA));
foobar(FooBar.combine(p::fooA, p::barB));
foobar(FooBar.combine(p::fooB, p::barA));
foobar(FooBar.combine(p::fooB, p::barB));
}
private static void foobar(FooBar fb) {
fb.foo();
fb.bar();
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgppbnRlcmZhY2UgRm9vIHsKICAgICAgICB2b2lkIGZvbygpOwp9CmludGVyZmFjZSBCYXIgewogICAgICAgIHZvaWQgYmFyKCk7Cn0KaW50ZXJmYWNlIEZvb0JhciBleHRlbmRzIEZvbywgQmFyIHsKICAgIHB1YmxpYyBzdGF0aWMgRm9vQmFyIGNvbWJpbmUoRm9vIGYsIEJhciBiKSB7CiAgICAJcmV0dXJuIG5ldyBGb29CYXIoKSB7CiAgICAJCXB1YmxpYyB2b2lkIGZvbygpIHsgZi5mb28oKTsgfQogICAgCQlwdWJsaWMgdm9pZCBiYXIoKSB7IGIuYmFyKCk7IH0KICAgIAl9OwogICAgfQp9CgpjbGFzcyBQYXJlbnQgewogICAgcHJvdGVjdGVkIFN0cmluZyBuZWVkZWRCeUZvbyA9ICJmb28iOwogICAgcHJvdGVjdGVkIFN0cmluZyBuZWVkZWRCeUJhciA9ICJiYXIiOwoKICAgIHB1YmxpYyB2b2lkIGZvb0EoKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5lZWRlZEJ5Rm9vICsgIkEiKTsKICAgIH0KICAgIHB1YmxpYyB2b2lkIGZvb0IoKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5lZWRlZEJ5Rm9vICsgIkIiKTsKICAgIH0KICAgIHB1YmxpYyB2b2lkIGJhckEoKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5lZWRlZEJ5QmFyICsgIkEiKTsKICAgIH0KICAgIHB1YmxpYyB2b2lkIGJhckIoKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5lZWRlZEJ5QmFyICsgIkIiKTsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgCVBhcmVudCBwID0gbmV3IFBhcmVudCgpOwogICAgCWZvb2JhcihGb29CYXIuY29tYmluZShwOjpmb29BLCBwOjpiYXJBKSk7CiAgICAJZm9vYmFyKEZvb0Jhci5jb21iaW5lKHA6OmZvb0EsIHA6OmJhckIpKTsKICAgIAlmb29iYXIoRm9vQmFyLmNvbWJpbmUocDo6Zm9vQiwgcDo6YmFyQSkpOwogICAgCWZvb2JhcihGb29CYXIuY29tYmluZShwOjpmb29CLCBwOjpiYXJCKSk7CiAgICB9CiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZvb2JhcihGb29CYXIgZmIpIHsKICAgIAlmYi5mb28oKTsKICAgIAlmYi5iYXIoKTsKICAgIH0KfQ==