Home » Beitrag verschlagwortet mit 'Upper Bound'

Schlagwort-Archive: Upper Bound

Lower Bounds – Wozu?

<? super MyClass>

Wozu sind Lower Bounds nützlich? Weshalb kann es hilfreich sein eine Klasse (als Input-Parameter) zu verlangen, nicht nicht spezifischer parametrisiert ist als vorgegeben?

Antwort: Weil ich für mich als Back-Caller die Anforderung bezüglich Spezifikationsgrad einschränke.

Das heisst: Wenn ich eine Methode eines Callbacks aufrufen muss, dann möchte ich sicherstellen, dass diese Method nichts genaueres verlangt als ich geben kann. Z.B. Ich kann Früchte zurückgeben, aber spezifikas z.B. von Trauben kann ich nicht liefern. Oder ich kann Number zurückgeben, nicht aber Double.

Beispiel:

WllCallYou bieted die multiply(WillBeCalled<? super Number> callback, int i1, int i2) Methode an, um zwei Integer miteinander zu multiplizieren und das Resultat an die getResult(T result) Methode des Callbacks zürück zu geben. Das Resultat wird aber nichts spezifischeres als Number sein. Das heisst: Der Callback darf nicht spezifischer als Number parametrisiert sein: <? super Number>

public class WillCallYou {
    public static void multiply(WillBeCalled<? super Number> callback, int i1, int i2){
        Integer integerResult = i1 * i2;
        callback.getResult(integerResult);
    }
}
public class WillBeCalled<T> {
    public void getResult(T result){
        System.out.println("The result is " + result);
    }
}
public class Main {
    public static void main(String[] args) {
        WillCallYou.multiply(new WillBeCalled<Number>(), 3, 4);
        WillCallYou.multiply(new WillBeCalled<Object>(), 3, 4);

        //Wrong first argument type ...
        //WillCallYou.multiply(new WillBeCalled<Float>(), 3, 4);
    }
}