Java Stream API mit echten Funktionstypen #298
Labels
No Label
Codegen
confirmed
duplicate
Eclipse-Plugin
Feature Request
generics
in progress
invalid
JavaCompilerCore
needs info
Parser
Trash
Type
Unify
won't fix
works for me
No Milestone
No project
No Assignees
4 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: JavaTX/JavaCompilerCore#298
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ich habe das Gefühl, dass die echten Funktionstypen für Lambda Ausdrücke Probleme mit Java Libraries wie der Stream API haben.
Beispiel:
Der JavaTX Compiler müsste ja einen ensprechenden FunN$$-Typen für die Lambda Expression
x -> 2*x
anlegen. Die map Funktion der Stream API verlangt aber als Eingabe ein funktionales Interface vom Typenjava.util.function.Funtion
und nicht den FunN Typen. Zumindest scheitert der Code mit einer großen Anzahl an unaufgelösten Constraints, ich weiß nicht, ob es wirklich daran liegt.Zum Beispiel kompiliert folgender Code mit javac ja auch nicht, weil
MyFuncInterface
keinejava.util.functions.Function
ist.Wenn ich allerdings die Lambda Expression explizit in ein
java.util.functions.Function
Typen speichere, kompliliert der Code, dann ist aber gewöhnlicher Java Code mit einem gewissen Mehraufwand und keinen echten Funktionstypen.Hier muss die Integration von Functional Interfaces und Function types noch implementiert werden (vgl. Kap 6 im angehängten Paper) implementiert werden. Hinweis: FunN* im Paper ist heute FunN$$.
Der Umweg über
funktioniert, es liegt also an den Constraints irgendwo.
Ich konnte das Problem etwas weiter eingrenzen:
So in etwa sieht die Definition von map aus.
Wenn ich das ganze etwas abändere:
dann funktioniert es. Es scheint also ein Problem mit
? super X
zu geben.Die Implementierung gefällt mir noch nicht besonders gut...
@stan vielleicht hast du eine bessere Idee wie man das machen kann. So wie es jetzt ist wird es nachher schwer den Unify auszugliedern.
Gut Erkannt. Der Unify benutzt jetzt Typen aus dem package ast.syntaxtree. Zum Beispiel
RefType
.Der Unify sollte allerdings nur seine eigenen Datenstrukturen verwenden (
UnifyType
). Die Typen in den Constraints müssen vor der Übergabe an den Unify Algorithmus in dessen Datenstruktur konvertiert werden.Das funktioniert aber auch nur im Spezialfall bei dem Input und Output den gleichen Typ haben. Bei einer Lambda-Funktion, die z.B. einen Integer als Input und einen Boolean als Output hat, gibt es unaufgelöste Constraints.
Ich glaube durch die Änderungen in RuleSet in
8fdfbf875b
geht es aktuell gar nicht mehrKannst du ein neues Beispiel geben welches nicht funktioniert?
z.B. das Beispiel von oben:
oder mit Predicate statt Function:
oder ohne direkte Zuweisung zu einem Functional Interface:
Ich hoffe es ist jetzt gefixt. Ich hatte noch alte class files rumliegen.