This code snippet for the interface SetObserver is taken from Effective Java (Avoid Excessive Synchronization Item 67)
public interface SetObserver<E> {
// Invoked when an element is added to the observable set
void added(ObservableSet<E> set, E element);
}
And the SetObserver is passed  to addObserver() and removeObserver method as given below :
// Broken - invokes alien method from synchronized block!
public class ObservableSet<E> extends ForwardingSet<E> {
  public ObservableSet(Set<E> set) {
    super(set);
  }
  private final List<SetObserver<E>> observers =
      new ArrayList<SetObserver<E>>();
  public void addObserver(SetObserver<E> observer) {
    synchronized (observers) {
      observers.add(observer);
    }
  }
  public boolean removeObserver(SetObserver<E> observer) {
    synchronized (observers) {
      return observers.remove(observer);
    }
  }
  private void notifyElementAdded(E element) {
    synchronized (observers) {
      for (SetObserver<E> observer : observers)
        observer.added(this, element);
    }
  }
Bloch refers to the SetObserver<E> interface  as a call back interface . When is a interface called an call back interface in Java? 
 
    