Java Typsystem - ich werd noch wahnsinnig :(

Von: , Frage gestellt am So, 14. Dez 2008

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<T, R> {
public abstract R apply(T value);
}
// Diese relativ merkwürdige Klasse ist nur als Beispiel gedacht
class ValueWrapper<T> {
protected T val;
public ValueWrapper(T value) {
this.val = value;
}
public <R> R map(UnaryFunction<T, R> f) {
return f.apply(this.val);
}
}
public class FunctorTest {  
public static void main(String[] args) {
ValueWrapper<String> valueWrapper = new ValueWrapper<String>("Hallo");
// Dieser Funktor soll wirklich auf ALLE Objekte anwendaber sein,
// nicht nur auf Strings.
UnaryFunction<Object, String> upperCase = new UnaryFunction<Object, String>() {
public String apply(Object x) {
return ("" + x).toUpperCase();
}
};
// Hier sollte eigentlich "HALLO" ausgegeben werden.
// Stattdessen kommt hier folgender Compilefehler:
//  "<R>map(UnaryFunction<java.lang.String,R>) in ValueWrapper<java.lang.String> 
//   cannot be applied to (UnaryFunction<java.lang.Object,java.lang.String>)
//     System.out.println(valueWrapper.map(upperCase));
//                                    ^
//   1 error"
System.out.println(valueWrapper.map(upperCase));
}
}

2 Antworten zu dieser Frage

  1. Antwort von nach 27 Minuten 1 hilfreich
    Re: Java Typsystem - ich werd noch wahnsinnig :(

    Hallo Natascha,

    ja, bei den Generics kann man leicht wahnsinnig werden und muss sich sehr konzentrieren. :-) 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<T> {
    protected T val;
    public ValueWrapper(T value) {
    this.val = value;
    }
    public <R> R map(UnaryFunction<? super T, R> f) {
    return f.apply(this.val);
    }
    }
    


    Gruß,

    Andreas

    • Antwort von nach 49 Minuten 0 hilfreich
      Re^2: Java Typsystem - ich werd noch wahnsinnig :(

      Hi Andreas,

      Du bist mein Held :)
      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]

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!