public class Main {
public interface IBar<T> {
public void start(Foo<T> foo);
}
public static class Bar<T> implements IBar<T> {
public void start(final Foo<T> foo) {
@Override
public void run() {
while (true) {
T baz = foo.getT();
//do something with the T baz object
foo.callBack();
}
}
}.start();
}
}
public static class Foo<T> {
private T baz;
private Bar<T> bar;
public Foo(T baz, Bar<T> bar) {
this.baz = baz;
this.bar = bar;
}
public void startBar() {
bar.start(this); // totally possible
}
public T getT() {
return baz;
}
public void callBack() {
System.
out.
println("called back"); }
}
public static void main
(String[] a
) { System.
out.
println("compiled and ran"); }
}
cHVibGljIGNsYXNzIE1haW4gewogICAgCiAgICBwdWJsaWMgaW50ZXJmYWNlIElCYXI8VD4gewogICAgICBwdWJsaWMgdm9pZCBzdGFydChGb288VD4gZm9vKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJhcjxUPiBpbXBsZW1lbnRzIElCYXI8VD4gewogICAgCiAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEZvbzxUPiBmb28pIHsKICAgICAgICBuZXcgVGhyZWFkKCkgewogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgICBUIGJheiA9IGZvby5nZXRUKCk7CiAgICAgICAgICAgICAgICAvL2RvIHNvbWV0aGluZyB3aXRoIHRoZSBUIGJheiBvYmplY3QKICAgICAgICAgICAgICAgIGZvby5jYWxsQmFjaygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0uc3RhcnQoKTsKICAgICAgfQogICAgCiAgICB9CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9vPFQ+IHsKICAgICAgcHJpdmF0ZSBUIGJhejsKICAgICAgcHJpdmF0ZSBCYXI8VD4gYmFyOwogICAgCiAgICAgIHB1YmxpYyBGb28oVCBiYXosIEJhcjxUPiBiYXIpIHsKICAgICAgICB0aGlzLmJheiA9IGJhejsKICAgICAgICB0aGlzLmJhciA9IGJhcjsKICAgICAgfQogICAgCiAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QmFyKCkgewogICAgICAgIGJhci5zdGFydCh0aGlzKTsgLy8gdG90YWxseSBwb3NzaWJsZQogICAgICB9CiAgICAKICAgICAgcHVibGljIFQgZ2V0VCgpIHsKICAgICAgICByZXR1cm4gYmF6OwogICAgICB9CiAgICAKICAgICAgcHVibGljIHZvaWQgY2FsbEJhY2soKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxsZWQgYmFjayIpOwogICAgICB9CiAgICB9CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGEpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNvbXBpbGVkIGFuZCByYW4iKTsKICAgIH0KfQ==