Best practices (oder Meinungen) zu functional interfaces und Methodennamen

Aber wo genau gilt diese Regel? Ich würde ja sagen, dass sie erst im Code der Methode (doSomething) zum Tragen kommt. Die „Methodensignatur“ selbst ist ja noch nicht der Consumer. Das Problem ist also, dass wenn da ? super T in der Signatur auftaucht, im Methodencode nicht mehr viel nach dem passenden Typ gesucht werden kann.

…und nun musst du in jedem XxxClusterMeasure explizit die Methode compute definieren… Hier fuktioniert auch

interface ClusterMeasure<T> {
  double compute(Cluster<? extends T> cluster0, Cluster<? extends T> cluster1);
}
public interface BinaryClusterMeasure<T> extends
  ToDoubleBiFunction<Cluster<? extends T>, Cluster<? extends T>>,
  ClusterMeasure<T>
{
  @Override
  default double applyAsDouble(Cluster<? extends T> t, Cluster<? extends T> u) {
    return compute(t, u);
  }
}

Aber vermutlich sollte BinaryClusterMeasure bereits das sein, was nun ClusterMeasure ist. Das ToDoubleBiFunction-Interface jedenfalls macht erst wieder im konkreteren Interface Sinn, analog zu vorhergehenden Beispielen also etwa

interface CustomerBinaryClusterMeasure extends
  ToDoubleBiFunction<Cluster<? extends Customer>, Cluster<? extends Customer>>,
  ClusterMeasure<Customer>{
...
}

Allerdings gilt dies nach wie vor nur, wenn in Methoden, an die Instanzen dieses Interfaces übergeben werden sollen, warum auch immer, super statt extends oder gar keinem Zusatz steht.