public class Main {
public interface FirstOperand {}
public interface SecondOperand {}
public interface Subtract<T extends FirstOperand,R extends SecondOperand> {
T subtract(T that, T other);
R subtract(T that, R other);
R subtract(R that, T other);
R subtract(R that, R other);
}
public interface Add<T extends FirstOperand,R extends SecondOperand> {
T add(T that, T other);
R add(T that, R other);
R add(R that, T other);
R add(R that, R other);
}
public static abstract class MyFunctional {
public static<T extends FirstOperand, R extends SecondOperand> T
compute(T a, T b, Subtract<T,R> substarcter) {
return substarcter.subtract(a, b);
}
public static<T extends FirstOperand, R extends SecondOperand> R
compute(T a, R b, Subtract<T,R> substarcter) {
return substarcter.subtract(a, b);
}
public static<T extends FirstOperand, R extends SecondOperand> R
compute(R a, T b, Subtract<T,R> substarcter) {
return substarcter.subtract(a, b);
}
public static<T extends FirstOperand, R extends SecondOperand> R
compute(R a, R b, Subtract<T,R> substarcter) {
return substarcter.subtract(a, b);
}
public static<T extends FirstOperand, R extends SecondOperand> T
compute(T a, T b, Add<T,R> adder) {
return adder.add(a, b);
}
public static<T extends FirstOperand, R extends SecondOperand> R
compute(T a, R b, Add<T,R> adder) {
return adder.add(a, b);
}
public static<T extends FirstOperand, R extends SecondOperand> R
compute(R a, T b, Add<T,R> adder) {
return adder.add(a, b);
}
public static<T extends FirstOperand, R extends SecondOperand> R
compute(R a, R b, Add<T,R> adder) {
return adder.add(a, b);
}
static class
Subtracter implements Subtract<FirstOperand, SecondOperand> {
@Override
public FirstOperand subtract(FirstOperand that, FirstOperand other) {
return null;
}
@Override
public SecondOperand subtract(FirstOperand that, SecondOperand other) {
return null;
}
@Override
public SecondOperand subtract(SecondOperand that, FirstOperand other) {
return null;
}
@Override
public SecondOperand subtract(SecondOperand that, SecondOperand other) {
return null;
}
}
static class
Adder implements Add<FirstOperand, SecondOperand> {
@Override
public FirstOperand add(FirstOperand that, FirstOperand other) {
return null;
}
@Override
public SecondOperand add(FirstOperand that, SecondOperand other) {
return null;
}
@Override
public SecondOperand add(SecondOperand that, FirstOperand other) {
return null;
}
@Override
public SecondOperand add(SecondOperand that, SecondOperand other) {
return null;
}
}
}
public static class A implements FirstOperand,SecondOperand {
private int a;
private int b;
public A(int a, int b){
this.a=a;
this.b=b;
}
public int getFirst(){
return a;
}
public int getSecond() {
return b;
}
@Override
return "("+a+" "+b+")";
}
}
public static class B implements FirstOperand,SecondOperand {
private int a;
private int b;
private int c;
public B(int a, int b, int c){
this.a=a;
this.b=b;
this.c = c;
}
public int getFirst(){
return a;
}
public int getSecond() {
return b;
}
public int getThird() {
return b;
}
@Override
return "("+a+" "+b+" "+c+")";
}
}
public static void main
(String[] args
) {
FirstOperand a = new A(1, 2);
FirstOperand b = new A(1, 2);
FirstOperand c = new A(1, 2);
SecondOperand d = new A(1, 2);
SecondOperand e = new A(1, 2);
FirstOperand f = new A(1, 2);
SecondOperand g = new A(1, 2);
SecondOperand h = new A(1, 2);
System.
out.
println("Hello World"); System.
out.
println(MyFunctional.
compute(a,b,
new MyFunctional.
Subtracter())); System.
out.
println(MyFunctional.
compute(c,d,
new MyFunctional.
Subtracter())); System.
out.
println(MyFunctional.
compute(e,f,
new MyFunctional.
Subtracter())); System.
out.
println(MyFunctional.
compute(e,f,
new MyFunctional.
Subtracter()));
System.
out.
println(MyFunctional.
compute(a,b,
new MyFunctional.
Adder())); System.
out.
println(MyFunctional.
compute(c,d,
new MyFunctional.
Adder())); System.
out.
println(MyFunctional.
compute(e,f,
new MyFunctional.
Adder())); System.
out.
println(MyFunctional.
compute(e,f,
new MyFunctional.
Adder()));
FirstOperand i = new A(1, 2);
FirstOperand j = new B(1, 2, 3);
FirstOperand k = new A(1, 2);
SecondOperand l = new B(1, 2, 3);
SecondOperand m = new A(1, 2);
FirstOperand n = new B(1, 2, 3);
SecondOperand o = new A(1, 2);
SecondOperand p = new B(1, 2, 3);
System.
out.
println(MyFunctional.
compute(i,j,
new MyFunctional.
Subtracter())); System.
out.
println(MyFunctional.
compute(k,l,
new MyFunctional.
Subtracter())); System.
out.
println(MyFunctional.
compute(m,n,
new MyFunctional.
Subtracter())); System.
out.
println(MyFunctional.
compute(o,p,
new MyFunctional.
Subtracter()));
System.
out.
println(MyFunctional.
compute(i,j,
new MyFunctional.
Adder())); System.
out.
println(MyFunctional.
compute(k,l,
new MyFunctional.
Adder())); System.
out.
println(MyFunctional.
compute(m,n,
new MyFunctional.
Adder())); System.
out.
println(MyFunctional.
compute(o,p,
new MyFunctional.
Adder()));
}
}
cHVibGljIGNsYXNzIE1haW4gewoKICAgIHB1YmxpYyBpbnRlcmZhY2UgRmlyc3RPcGVyYW5kIHt9CgogICAgcHVibGljIGludGVyZmFjZSBTZWNvbmRPcGVyYW5kIHt9CgogICAgcHVibGljIGludGVyZmFjZSBTdWJ0cmFjdDxUIGV4dGVuZHMgRmlyc3RPcGVyYW5kLFIgZXh0ZW5kcyBTZWNvbmRPcGVyYW5kPiB7CiAgICAgICAgVCBzdWJ0cmFjdChUIHRoYXQsIFQgb3RoZXIpOwogICAgICAgIFIgc3VidHJhY3QoVCB0aGF0LCBSIG90aGVyKTsKICAgICAgICBSIHN1YnRyYWN0KFIgdGhhdCwgVCBvdGhlcik7CiAgICAgICAgUiBzdWJ0cmFjdChSIHRoYXQsIFIgb3RoZXIpOwogICAgfQoKICAgIHB1YmxpYyBpbnRlcmZhY2UgQWRkPFQgZXh0ZW5kcyBGaXJzdE9wZXJhbmQsUiBleHRlbmRzIFNlY29uZE9wZXJhbmQ+IHsKICAgICAgICBUIGFkZChUIHRoYXQsIFQgb3RoZXIpOwogICAgICAgIFIgYWRkKFQgdGhhdCwgUiBvdGhlcik7CiAgICAgICAgUiBhZGQoUiB0aGF0LCBUIG90aGVyKTsKICAgICAgICBSIGFkZChSIHRoYXQsIFIgb3RoZXIpOwogICAgfQoKCiAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIE15RnVuY3Rpb25hbCB7CgogICAgICAgIHB1YmxpYyBzdGF0aWM8VCBleHRlbmRzIEZpcnN0T3BlcmFuZCwgUiBleHRlbmRzIFNlY29uZE9wZXJhbmQ+IFQKICAgICAgICBjb21wdXRlKFQgYSwgVCBiLCBTdWJ0cmFjdDxULFI+IHN1YnN0YXJjdGVyKSB7CiAgICAgICAgICAgIHJldHVybiBzdWJzdGFyY3Rlci5zdWJ0cmFjdChhLCBiKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBzdGF0aWM8VCBleHRlbmRzIEZpcnN0T3BlcmFuZCwgUiBleHRlbmRzIFNlY29uZE9wZXJhbmQ+IFIKICAgICAgICBjb21wdXRlKFQgYSwgUiBiLCBTdWJ0cmFjdDxULFI+IHN1YnN0YXJjdGVyKSB7CiAgICAgICAgICAgIHJldHVybiBzdWJzdGFyY3Rlci5zdWJ0cmFjdChhLCBiKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBzdGF0aWM8VCBleHRlbmRzIEZpcnN0T3BlcmFuZCwgUiBleHRlbmRzIFNlY29uZE9wZXJhbmQ+IFIKICAgICAgICBjb21wdXRlKFIgYSwgVCBiLCBTdWJ0cmFjdDxULFI+IHN1YnN0YXJjdGVyKSB7CiAgICAgICAgICAgIHJldHVybiBzdWJzdGFyY3Rlci5zdWJ0cmFjdChhLCBiKTsKICAgICAgICB9CiAgICAgICAgcHVibGljIHN0YXRpYzxUIGV4dGVuZHMgRmlyc3RPcGVyYW5kLCBSIGV4dGVuZHMgU2Vjb25kT3BlcmFuZD4gUgogICAgICAgIGNvbXB1dGUoUiBhLCBSIGIsIFN1YnRyYWN0PFQsUj4gc3Vic3RhcmN0ZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHN1YnN0YXJjdGVyLnN1YnRyYWN0KGEsIGIpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHN0YXRpYzxUIGV4dGVuZHMgRmlyc3RPcGVyYW5kLCBSIGV4dGVuZHMgU2Vjb25kT3BlcmFuZD4gVAogICAgICAgIGNvbXB1dGUoVCBhLCBUIGIsIEFkZDxULFI+IGFkZGVyKSB7CiAgICAgICAgICAgIHJldHVybiBhZGRlci5hZGQoYSwgYik7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgc3RhdGljPFQgZXh0ZW5kcyBGaXJzdE9wZXJhbmQsIFIgZXh0ZW5kcyBTZWNvbmRPcGVyYW5kPiBSCiAgICAgICAgY29tcHV0ZShUIGEsIFIgYiwgQWRkPFQsUj4gYWRkZXIpIHsKICAgICAgICAgICAgcmV0dXJuIGFkZGVyLmFkZChhLCBiKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBzdGF0aWM8VCBleHRlbmRzIEZpcnN0T3BlcmFuZCwgUiBleHRlbmRzIFNlY29uZE9wZXJhbmQ+IFIKICAgICAgICBjb21wdXRlKFIgYSwgVCBiLCBBZGQ8VCxSPiBhZGRlcikgewogICAgICAgICAgICByZXR1cm4gYWRkZXIuYWRkKGEsIGIpOwogICAgICAgIH0KICAgICAgICBwdWJsaWMgc3RhdGljPFQgZXh0ZW5kcyBGaXJzdE9wZXJhbmQsIFIgZXh0ZW5kcyBTZWNvbmRPcGVyYW5kPiBSCiAgICAgICAgY29tcHV0ZShSIGEsIFIgYiwgQWRkPFQsUj4gYWRkZXIpIHsKICAgICAgICAgICAgcmV0dXJuIGFkZGVyLmFkZChhLCBiKTsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyBjbGFzcwogICAgICAgIFN1YnRyYWN0ZXIgaW1wbGVtZW50cyBTdWJ0cmFjdDxGaXJzdE9wZXJhbmQsIFNlY29uZE9wZXJhbmQ+IHsKCiAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICBwdWJsaWMgRmlyc3RPcGVyYW5kIHN1YnRyYWN0KEZpcnN0T3BlcmFuZCB0aGF0LCBGaXJzdE9wZXJhbmQgb3RoZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIFNlY29uZE9wZXJhbmQgc3VidHJhY3QoRmlyc3RPcGVyYW5kIHRoYXQsIFNlY29uZE9wZXJhbmQgb3RoZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIFNlY29uZE9wZXJhbmQgc3VidHJhY3QoU2Vjb25kT3BlcmFuZCB0aGF0LCBGaXJzdE9wZXJhbmQgb3RoZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIFNlY29uZE9wZXJhbmQgc3VidHJhY3QoU2Vjb25kT3BlcmFuZCB0aGF0LCBTZWNvbmRPcGVyYW5kIG90aGVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3RhdGljIGNsYXNzCiAgICAgICAgQWRkZXIgaW1wbGVtZW50cyBBZGQ8Rmlyc3RPcGVyYW5kLCBTZWNvbmRPcGVyYW5kPiB7CgogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIEZpcnN0T3BlcmFuZCBhZGQoRmlyc3RPcGVyYW5kIHRoYXQsIEZpcnN0T3BlcmFuZCBvdGhlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICBwdWJsaWMgU2Vjb25kT3BlcmFuZCBhZGQoRmlyc3RPcGVyYW5kIHRoYXQsIFNlY29uZE9wZXJhbmQgb3RoZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIFNlY29uZE9wZXJhbmQgYWRkKFNlY29uZE9wZXJhbmQgdGhhdCwgRmlyc3RPcGVyYW5kIG90aGVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1YmxpYyBTZWNvbmRPcGVyYW5kIGFkZChTZWNvbmRPcGVyYW5kIHRoYXQsIFNlY29uZE9wZXJhbmQgb3RoZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBBIGltcGxlbWVudHMgRmlyc3RPcGVyYW5kLFNlY29uZE9wZXJhbmQgewogICAgICAgIHByaXZhdGUgaW50IGE7CiAgICAgICAgcHJpdmF0ZSBpbnQgYjsKCiAgICAgICAgcHVibGljIEEoaW50IGEsIGludCBiKXsKICAgICAgICAgICAgdGhpcy5hPWE7CiAgICAgICAgICAgIHRoaXMuYj1iOwogICAgICAgIH0KICAgICAgICBwdWJsaWMgaW50IGdldEZpcnN0KCl7CiAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBnZXRTZWNvbmQoKSB7CiAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgIH0KCiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuICIoIithKyIgIitiKyIpIjsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBCIGltcGxlbWVudHMgRmlyc3RPcGVyYW5kLFNlY29uZE9wZXJhbmQgewogICAgICAgIHByaXZhdGUgaW50IGE7CiAgICAgICAgcHJpdmF0ZSBpbnQgYjsKICAgICAgICBwcml2YXRlIGludCBjOwoKICAgICAgICBwdWJsaWMgQihpbnQgYSwgaW50IGIsIGludCBjKXsKICAgICAgICAgICAgdGhpcy5hPWE7CiAgICAgICAgICAgIHRoaXMuYj1iOwogICAgICAgICAgICB0aGlzLmMgPSBjOwogICAgICAgIH0KICAgICAgICBwdWJsaWMgaW50IGdldEZpcnN0KCl7CiAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBnZXRTZWNvbmQoKSB7CiAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBnZXRUaGlyZCgpIHsKICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICByZXR1cm4gIigiK2ErIiAiK2IrIiAiK2MrIikiOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgogICAgICAgIEZpcnN0T3BlcmFuZCBhID0gbmV3IEEoMSwgMik7CiAgICAgICAgRmlyc3RPcGVyYW5kIGIgPSBuZXcgQSgxLCAyKTsKCiAgICAgICAgRmlyc3RPcGVyYW5kIGMgPSBuZXcgQSgxLCAyKTsKICAgICAgICBTZWNvbmRPcGVyYW5kIGQgPSBuZXcgQSgxLCAyKTsKCiAgICAgICAgU2Vjb25kT3BlcmFuZCBlID0gbmV3IEEoMSwgMik7CiAgICAgICAgRmlyc3RPcGVyYW5kIGYgPSBuZXcgQSgxLCAyKTsKCiAgICAgICAgU2Vjb25kT3BlcmFuZCBnID0gbmV3IEEoMSwgMik7CiAgICAgICAgU2Vjb25kT3BlcmFuZCBoID0gbmV3IEEoMSwgMik7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gV29ybGQiKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oTXlGdW5jdGlvbmFsLmNvbXB1dGUoYSxiLCBuZXcgTXlGdW5jdGlvbmFsLlN1YnRyYWN0ZXIoKSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihNeUZ1bmN0aW9uYWwuY29tcHV0ZShjLGQsIG5ldyBNeUZ1bmN0aW9uYWwuU3VidHJhY3RlcigpKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKE15RnVuY3Rpb25hbC5jb21wdXRlKGUsZiwgbmV3IE15RnVuY3Rpb25hbC5TdWJ0cmFjdGVyKCkpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oTXlGdW5jdGlvbmFsLmNvbXB1dGUoZSxmLCBuZXcgTXlGdW5jdGlvbmFsLlN1YnRyYWN0ZXIoKSkpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oTXlGdW5jdGlvbmFsLmNvbXB1dGUoYSxiLCBuZXcgTXlGdW5jdGlvbmFsLkFkZGVyKCkpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oTXlGdW5jdGlvbmFsLmNvbXB1dGUoYyxkLCBuZXcgTXlGdW5jdGlvbmFsLkFkZGVyKCkpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oTXlGdW5jdGlvbmFsLmNvbXB1dGUoZSxmLCBuZXcgTXlGdW5jdGlvbmFsLkFkZGVyKCkpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oTXlGdW5jdGlvbmFsLmNvbXB1dGUoZSxmLCBuZXcgTXlGdW5jdGlvbmFsLkFkZGVyKCkpKTsKCiAgICAgICAgRmlyc3RPcGVyYW5kIGkgPSBuZXcgQSgxLCAyKTsKICAgICAgICBGaXJzdE9wZXJhbmQgaiA9IG5ldyBCKDEsIDIsIDMpOwoKICAgICAgICBGaXJzdE9wZXJhbmQgayA9IG5ldyBBKDEsIDIpOwogICAgICAgIFNlY29uZE9wZXJhbmQgbCA9IG5ldyBCKDEsIDIsIDMpOwoKICAgICAgICBTZWNvbmRPcGVyYW5kIG0gPSBuZXcgQSgxLCAyKTsKICAgICAgICBGaXJzdE9wZXJhbmQgbiA9IG5ldyBCKDEsIDIsIDMpOwoKICAgICAgICBTZWNvbmRPcGVyYW5kIG8gPSBuZXcgQSgxLCAyKTsKICAgICAgICBTZWNvbmRPcGVyYW5kIHAgPSAgbmV3IEIoMSwgMiwgMyk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihNeUZ1bmN0aW9uYWwuY29tcHV0ZShpLGosIG5ldyBNeUZ1bmN0aW9uYWwuU3VidHJhY3RlcigpKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKE15RnVuY3Rpb25hbC5jb21wdXRlKGssbCwgbmV3IE15RnVuY3Rpb25hbC5TdWJ0cmFjdGVyKCkpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oTXlGdW5jdGlvbmFsLmNvbXB1dGUobSxuLCBuZXcgTXlGdW5jdGlvbmFsLlN1YnRyYWN0ZXIoKSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihNeUZ1bmN0aW9uYWwuY29tcHV0ZShvLHAsIG5ldyBNeUZ1bmN0aW9uYWwuU3VidHJhY3RlcigpKSk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihNeUZ1bmN0aW9uYWwuY29tcHV0ZShpLGosIG5ldyBNeUZ1bmN0aW9uYWwuQWRkZXIoKSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihNeUZ1bmN0aW9uYWwuY29tcHV0ZShrLGwsIG5ldyBNeUZ1bmN0aW9uYWwuQWRkZXIoKSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihNeUZ1bmN0aW9uYWwuY29tcHV0ZShtLG4sIG5ldyBNeUZ1bmN0aW9uYWwuQWRkZXIoKSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihNeUZ1bmN0aW9uYWwuY29tcHV0ZShvLHAsIG5ldyBNeUZ1bmN0aW9uYWwuQWRkZXIoKSkpOwoKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCeWUiKTsKICAgIH0KfQo=