Syntax-Fehler beim aufrufen von generischen Klassenmethoden

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo Leute,

das sieht vllt. ein wenig verrückt aus, was ich hier mache, aber nichts destotrotz maul der der Java-Compiler die ganze Zeit an einer Stelle meines Quelltextes rum. Ich weiß echt nicht mehr weiter.

Der Code:

Code:
// Schnittstelle für Funktionsobjekte.
public interface Function<A,B> {
  public B evaluate(final A x);
}


import java.util.List;

// Klasse zur Bereistellung von Funktionsobjekten
public final class F {
  //Funktionsobjekt, das für eine Liste ermittelt ob sie leer ist.
  public static <A> Function<List<A>, Boolean> IsEmpty()  {
    return new Function<List<A>, Boolean>() {
      public Boolean evaluate(List<A> x) {
        return x.isEmpty();
      }
    };
  }
  // Funktionsobjekt, das sein argument logisch negiert.
  public static Function<Boolean,Boolean> Not() {
    return new Function<Boolean,Boolean>() {
      public Boolean evaluate(Boolean x) {
        return !x;
      }
    };
  }
  // Funktionsobejt, das zwei Funktionsobjekte zusammen setzt, ala (f ° g)(x) = f(g(x))
  public static <A,B,C> Function<A,C> Cat(final Function<B,C> f, final Function<A,B> g) {
    return new Function<A,C>() {
      public C evaluate(A x) {
        return f.evaluate(g.evaluate(x));
      }
    };
  }
  // Aus den oberen Funktionsobjekten zusammengesetztes, dass das Gegenteil von
  // IsEmpty liefern soll. (Das ginge vielleicht auch anders, aber der Code ist konstruiert
  // und vom eigentlich Problem soweit heruntergebrochen wurden.
  public static <A> Function<List<A>, Boolean> NotEmpty() {
    return Cat(Not(), IsEmpty<A>());
  }
}

In der letzten Zeile mit dem return bekomme ich immer den Fehler:

F.java:40: illegal start of expression
return Cat(Not(), IsEmpty<A>());
^
F.java:40: ')' expected
return Cat(Not(), IsEmpty<A>());
^

Das scheint daran zu liegen, dass ich der statischen Funktion IsEmpty ihren Typparameter übergeben will. Geht das nicht oder verwende ich nur die falsche Syntax? Lasse ich den Typparameter weg, bekomme ich folgende Fehlermeldung:

found : Function<java.util.List<java.lang.Object>,java.lang.Boolean>
required: Function<java.util.List<A>,java.lang.Boolean>
return Cat(Not(), IsEmpty());
^
Also wie gesagt, ich weiß an dieser Stelle nicht mehr weiter. Es wäre echt sehr nett, wenn mir jemand helfen könnte.

Besten Dank im Voraus,

Martin.
 
B

Beni

Gast
Nein, Generics können so nicht gesetzt werden. Da deine argumentlosen Methoden auch keine Generics benötigen (sie machen ja nichts mit dem Inhalt der Listen), kann man einige Generics durch Wildcards ersetzen, und so wieder korrekten Code generieren:

Code:
//Schnittstelle für Funktionsobjekte.
interface Function<A,B> {
    public B evaluate(final A x);
}

//Klasse zur Bereistellung von Funktionsobjekten
public final class GenericTest {
//  Funktionsobjekt, das für eine Liste ermittelt ob sie leer ist.
    public static Function<List<?>, Boolean> IsEmpty()  {
        return new Function<List<?>, Boolean>() {
            public Boolean evaluate(List<?> x) {
                return x.isEmpty();
            }
        };
    }
//  Funktionsobjekt, das sein argument logisch negiert.
    public static Function<Boolean,Boolean> Not() {
        return new Function<Boolean,Boolean>() {
            public Boolean evaluate(Boolean x) {
                return !x;
            }
        };
    }
//  Funktionsobejt, das zwei Funktionsobjekte zusammen setzt, ala (f ° g)(x) = f(g(x))
    public static <A,B,C> Function<A,C> Cat(final Function<B,C> f, final Function<A,B> g) {
        return new Function<A,C>() {
            public C evaluate(A x) {
                return f.evaluate(g.evaluate(x));
            }
        };
    }
//  Aus den oberen Funktionsobjekten zusammengesetztes, dass das Gegenteil von
//  IsEmpty liefern soll. (Das ginge vielleicht auch anders, aber der Code ist konstruiert
//  und vom eigentlich Problem soweit heruntergebrochen wurden.
    public static Function<List<?>, Boolean> NotEmpty() {
        return Cat(Not(), IsEmpty());
    }
}

Eine andere Variante: anstelle von Methoden die "Function"-Objekte erzeugen, machst du ein paar benannte Klassen. Dann würde dein "NotEmpty" halt so aussehen:
Code:
    public static <A> Function<List<A>, Boolean> NotEmpty() {
  // nit einer Klasse "IsEmpty"
        return Cat(Not(), new IsEmpty<A>());
    }

P.S. In Java schreibt man Methoden normalerweise klein :bae:
 
G

Guest

Gast
Vielen Dank für die schnelle Hilfe.

Ich habe das so wie vorgschlagen mit den Wildcards umgesetzt und es funktioniert. Als ich dann weiter Programmiert habe, kam dann ein neuer Fehler ähnlicher Art. Das Interface Function sei wie oben belassen, die Klasse F aber um zwei statische Methoden zur Funktionobjektserzeugung erweitert. id liefert das Funktionsobjekt, das einfach nur sein Argument zurückgibt und id2 wendet id mittels cat zweimal hintereinander an, was zwar total nutzlos ist, aber eine heruntergebrochene Version des eigentlichen Problems ist.

Code:
public final class F
{
  // Funktion, die zwei Funktionsobjekte zusammensetzt, ala (f ° g)(x) = f(g(x)) 
  public static <A, B, C> Function<A, C> cat(final Function<B, C> f, final Function<A, B> g) {
    return new Function<A, C>() {
      public C evaluate(A x) {
        return f.evaluate(g.evaluate(x));
      }
    };
  }
  // Funktionsobjekt für die identische Funktion, ala id(x) = x
  public static <A> Function<A, A> id() {
    return new Function<A, A>() {
      public A evaluate(A x) {
        return x;
      }
    };
  }
  // Funktionsobjekt für die doppelt angewendete identische Funktion id2 = id ° id
  public static <A> Function<A, A> id2() {
    return cat(id(), id());
  }
}

Die letzte Funktion lehnt der Compiler wieder ab, mit folgender Fehlermeldung:

F.java:28: incompatible types
found : Function<java.lang.Object,java.lang.Object>
required: Function<A,A>
return cat(id(), id());

Wie es aussieht instantiert der Compiler id() vom Typ
Code:
Function<Object,Object>
anstatt als
Code:
Function<A,A>
. Gibt es einen Weg den Compiler davon zu überzeugen, das Funktionsobjekt richtig zu instantiieren?

Wer sich fragt, was ich hier für komische Dinge treibe, der bekommt unter http://www.haskell.org/ einen Einblick.

Erneut vielen Dank im Voraus,

Martin.
 
B

Beni

Gast
Zuerst wollte ich dir Casts vorschlagen, dann fiel mir ein, dass die Generics doch indirekt eingeschmuggelt werden können:
Code:
    // Funktionsobjekt für die doppelt angewendete identische Funktion id2 = id ° id
    public static <A> Function<A, A> id2() {
        Function<A,A> idA = id();
        Function<A,A> idB = id();
        
        return cat( idA, idB );
    }
Ich vermute mal, der Compiler wird sogar idA und idB wegoptimieren.

Naja, damit könntest du wohl auch die Wildcards vermeiden :-/
 
G

Guest

Gast
Danke, jetzt ist das Problem gelöst. Und die Wildcards musste ich sogar zugunsten dieser Variante fallen lassen, weil es sonst an anderen Stellen hakt.

Das ganze ist natürlich ziemlich häßlich, was da im Ergebnis rauskommt. Im einem konkreten Beispiel sieht das jetzt so aus:
Code:
  public final[B] List[B] map(final Function<A,B> f)
  {
    Function<List<A>,Boolean> nl = L.isEmpty();
    Function<List<A>,A>       hd = L.head();
    Function<List<A>,List<A>> tl = L.tail();
    return new Iterate<B,List<A>>(this, tl, nl, P.cat(f, hd));
  }
wobei
Code:
  public final[B] List[B] map(final Function<A,B> f)
  {
    return new Iterate<B,List<A>>(this, L.tail<A>(), L.isEmpty<A>(), P.cat(f, L.head<A>()));
  }
natürlich viel kürzer und prägnanter wäre. Aber wenn das nicht geht, habe ich natürlich keine Wahl. Aber vielleicht gelant sowas ja man irgendwann in die Sprache Java hinein.

Also, besten Dank nochmal,

Martin.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Tommy135 Syntax Highlighting Allgemeine Java-Themen 3
Elyt Compiler-Fehler Datei kann nicht erstellt werden. Die Syntax für den Dateinamen etc. ist falsch. Allgemeine Java-Themen 2
W JavaCC to create my only syntax Allgemeine Java-Themen 5
B Syntax-Erkennungs Problem Allgemeine Java-Themen 2
H Syntax ProcessBuilder Allgemeine Java-Themen 7
B Syntax-Highlighting abspeichern Allgemeine Java-Themen 7
T Parseerror bei richtiger Syntax Allgemeine Java-Themen 5
M Syntax Highlighter für MS Word? Allgemeine Java-Themen 2
H Pattern.compile Syntax Allgemeine Java-Themen 15
S Mail Adressen Syntax prüfen Allgemeine Java-Themen 22
C Syntax printf Allgemeine Java-Themen 5
S Eine Collection von Objekten mit LDAP Syntax filtern Allgemeine Java-Themen 5
P JTextPane mit Java (eclipse) Syntax Highlighting Allgemeine Java-Themen 4
D Kompakte Syntax für Funktionen Allgemeine Java-Themen 7
G Syntax für den Dateinamen Allgemeine Java-Themen 1
R Syntax Error, der keiner sein sollte Allgemeine Java-Themen 12
G Java Syntax Allgemeine Java-Themen 7
T Syntax Error Allgemeine Java-Themen 9
F Plugin damit M$ Word Java syntax versteht? Allgemeine Java-Themen 12
D Die <> Syntax Allgemeine Java-Themen 8
W Syntax - Frage Allgemeine Java-Themen 6
padde479 jEdit Syntax Highlighting Allgemeine Java-Themen 3
V syntax problem Allgemeine Java-Themen 6
S Syntax Error, insert "AssignmentOperator Expression&amp Allgemeine Java-Themen 3
F log4j XML-Syntax Allgemeine Java-Themen 4
B Syntax error on token ,VariableDeclaratorId expected after. Allgemeine Java-Themen 3
G Syntax Übersicht Suche Allgemeine Java-Themen 7
A gültige syntax einer ip-adresse? Allgemeine Java-Themen 2
S java syntax zusammenfassung Allgemeine Java-Themen 1
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
S Fehler: <ID> erwartet Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
Pinhg Discord JDA Bot - Fehler Allgemeine Java-Themen 3
KonradN CVE-2022-21449: Fehler in Java bei Signaturprüfung Allgemeine Java-Themen 20
L Fehler mit Boolean. (Glaube ich zumindest) Allgemeine Java-Themen 6
P Selenium Scriipt zeigt Fehler beim Import Allgemeine Java-Themen 3
O Fehler bei Variablen Allgemeine Java-Themen 2
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
M Kein Scanner Fehler durch falsche EIngabe Allgemeine Java-Themen 4
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
C Fehler bei der Benutzung von itextpdf Allgemeine Java-Themen 1
U Fehler beim Compillieren Allgemeine Java-Themen 13
x46 String Format Fehler Allgemeine Java-Themen 2
bueseb84 Fehler beim Import von Maven Dependencies aus lokalem artifactory Allgemeine Java-Themen 2
MiMa Datei verschieben hat einen Fehler?? Allgemeine Java-Themen 20
O xlsx Datei auslesen mit POI von Apache wirft seltsamen Fehler. Allgemeine Java-Themen 11
T Java-Quiz Code Fehler Allgemeine Java-Themen 10
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Fehler bei IF abfrage Allgemeine Java-Themen 8
C Fehler beim Debuggen von Listen Allgemeine Java-Themen 4
M Einheitenrechner - Fehler Allgemeine Java-Themen 12
D Erste Schritte Fehler mit negativen und 0 Zahlen im String Allgemeine Java-Themen 6
T Denk-Fehler? Allgemeine Java-Themen 4
A Finde den Fehler nicht. Allgemeine Java-Themen 7
H Class 'java.io.BuferedReader' is not present in JRE Emulation Libary | GWT Fehler?! Allgemeine Java-Themen 0
D Unbekannter Fehler Allgemeine Java-Themen 1
R Fehler im Code Allgemeine Java-Themen 1
R Fehler im Code Allgemeine Java-Themen 3
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
R Wo ist mein Fehler in diesem Code Allgemeine Java-Themen 7
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
L Fehler bei der Ausführung einer Jar Allgemeine Java-Themen 2
T OOP Fehler im Design Allgemeine Java-Themen 9
Thallius Unfassbarer Fehler. Brauche Ideen zum Debuggen Allgemeine Java-Themen 9
U Eclipse MANIFEST fehler Allgemeine Java-Themen 7
I Fehler bei HashMaps Darstellung Allgemeine Java-Themen 10
R Classnotfoundexception Fehler Allgemeine Java-Themen 3
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
N Compiler-Fehler Warum erhalte ich einen Nullpointer Fehler? Allgemeine Java-Themen 2
N Prim's Algorithm - wo ist der Fehler? Allgemeine Java-Themen 3
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
M Line-Fehler Allgemeine Java-Themen 8
U Input/Output Warum wirft mir das Programm diesen Fehler? Allgemeine Java-Themen 6
RalleYTN Merkwürdiger Fehler mit JFrame im Vollbild Allgemeine Java-Themen 4
V AudioInputStream Fehler Allgemeine Java-Themen 1
J Interpreter-Fehler Fehler beim Verschlüsseln Invalid AES key length Allgemeine Java-Themen 1
G Fehler mit Vector Allgemeine Java-Themen 3
F Java Fehler "buildTableModel" Allgemeine Java-Themen 3
F Fehler in Zeile in Log schreiben Allgemeine Java-Themen 6
DanielsLPecke Input/Output Arduino komischer Fehler. Allgemeine Java-Themen 38
V JavaFX Fehler beim Starten einer Jar Allgemeine Java-Themen 7
S Hashtable Fehler Allgemeine Java-Themen 14
S Zwei String vergleichen, Fehler markieren Allgemeine Java-Themen 3
C Hilfe bei einer Fehler meldung Allgemeine Java-Themen 3
K Was ist mein Fehler? Allgemeine Java-Themen 2
Tausendsassa Compiler-Fehler Fertiges Programm mit Fehler Allgemeine Java-Themen 10
B Eclipse Nach Export einer .jar Fehler: Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 5
K Fehler beim erstellen von .jar Datei Allgemeine Java-Themen 3
P Java Fehler auf Win2008 Server java.io.FilePermission IE8 Version JRE 1.7.0_51 Allgemeine Java-Themen 7
M Eclipse - Fehler: Hauptklasse de.xyz.init.MeineKlasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 2
Seikuassi Swing Stehe auf dem Schlauch...(BufferedReader_Writer-Fehler?) Allgemeine Java-Themen 4
M Eclipse Fehler beim Installieren des Plugins "Jigloo" Allgemeine Java-Themen 12
A Eclipse - Fehler beim "RUN" - "Unable to Launch - The selection cannot be launched" Allgemeine Java-Themen 6
B Fehler bei einem Programm Allgemeine Java-Themen 10
F HILFEEEEEE JAVA Fehler - Tiny Umbrella Allgemeine Java-Themen 1
N JavaFX IndexOutOfBounds-Fehler Allgemeine Java-Themen 11
N GPIB - Fehler: Unable to open device Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben