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.