Java Typsystem - ich werd noch wahnsinnig :(

Hallo allerseits,

ich versuche gerade Funktoren/Funktionsobjekte mit Java zu realsieren, schein hier aber etwas an den Generics zu scheitern und bekomm immer nur Compilefehler.
Da ich deshalb glaub schon bald dem Wahnsinn nahe bin, dacht ich mir, ich frag hier mal in die Runde, ob mir jemand weiterhelfen kann und mir vielleicht sagen kann, wo genau mein Denkfehler liegt und wie man das ändern muss (Code siehe unten).

Ganz lieben Dank schon im Voraus für Eure Hilfe.

Liebe Grüsse
Natascha

abstract class UnaryFunction {
 public abstract R apply(T value);
}

// Diese relativ merkwürdige Klasse ist nur als Beispiel gedacht
class ValueWrapper {
 protected T val;

 public ValueWrapper(T value) {
 this.val = value;
 }

 public R map(UnaryFunction f) {
 return f.apply(this.val);
 }
}

public class FunctorTest { 
 public static void main(String[] args) {
 ValueWrapper valueWrapper = new ValueWrapper("Hallo");

 // Dieser Funktor soll wirklich auf ALLE Objekte anwendaber sein,
 // nicht nur auf Strings.
 UnaryFunction upperCase = new UnaryFunction() {
 public String apply(Object x) {
 return ("" + x).toUpperCase();
 }
 };

 // Hier sollte eigentlich "HALLO" ausgegeben werden.
 // Stattdessen kommt hier folgender Compilefehler:
 // "map(UnaryFunction) in ValueWrapper 
 // cannot be applied to (UnaryFunction)
 // System.out.println(valueWrapper.map(upperCase));
 // ^
 // 1 error"
 System.out.println(valueWrapper.map(upperCase));
 }
}

Hallo Natascha,

ja, bei den Generics kann man leicht wahnsinnig werden und muss sich sehr konzentrieren. :smile: In der map-Methode der Klasse ValueWrapper bist du nicht generisch genug für deinen Aufruf: Dir genügt ja eine Funktion, die auf irgendeinem Supertyp von T operiert.

class ValueWrapper {
protected T val;

public ValueWrapper(T value) {
this.val = value;
}

public R map(UnaryFunction? super T, R> f) {
return f.apply(this.val);
}
}

Gruß,

Andreas

Hi Andreas,

Du bist mein Held :smile:
Noch nie hab ich in irgend’nem Forum so schnell so 'ne kompetente Antwort erhalten.

1000 Dank - es funktioniert genau so, wie Du es gesagt hast.

Liebe Grüße und noch 'n ganz schönen Sonntag.
Natascha

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]