Substitution ? ext/sup TPH [TPH -> ? ext/sup Type] funktioniert nicht/ Problem in SetWildcardType #165
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
2 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: JavaTX/JavaCompilerCore#165
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?
In Unify.SUBST wird wird SetWildcardType aufgrefufen. Dies funktioniert aber nur für RefTypes.
Wenn kein Reftype eingestezt werden soll macht die Methode einfach garnichts.
Grundsätzlich ist richtig, dass zumindest keine Wildcards eingesetzt werden dürfen. Aber einfach garnichts machen ist schwierig.
Zuminest Typvars sollten funktiuonieren.
Das eigentliche Problem ist, dass bei ? ext/super TYPE alles Type's eingesetzt werden dürfen. Man sollte eine Superklasse für alle Klasse einführen, die als TYPE vorkomen dürfen.
Dann könnte man SetWildcardType genau diesen Typ als Typ des Arguments geben.
ObjectType wurde implementiert.
Es entstehen nun allerdings Exceptions im Unify.
plugindevelopment.TypeInsertTests.Add (Add-Test) wirft nun die Exception:
java.lang.ClassCastException: de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType cannot be cast to de.dhbwstuttgart.syntaxtree.type.ObjectType
at de.dhbwstuttgart.typeinference.unify.Unify.sub_unify(Unify.java:1062)
at de.dhbwstuttgart.typeinference.unify.Unify.sub_unify(Unify.java:1011)
at de.dhbwstuttgart.typeinference.unify.Unify.unify(Unify.java:119)
at de.dhbwstuttgart.typeinference.unify.Unify.unify(Unify.java:675)
at de.dhbwstuttgart.syntaxtree.SourceFile.lambda$3(SourceFile.java:810)
In TypeExpr in Lambdaexpression soll folgendes eingefügt werden:
Fun<? ext rTy, ? super argTy> (x) -> f(x),
wenn x:argTy oder x:? super argTy und
wenn f(x):rTy oder f(x): ? extends rTy
In allen anderen Fällen ist es ein Typfehler.
(In reply to Martin Plümicke from comment #3)
Wurd eingefügt. In LambdaTest4 entsteht nun folgendes ConstraintSet:
Karthesisches Produkt der Constraints: [[
(Fun1< java.lang.String, java.lang.String > <. Fun1< java.lang.String, java.lang.String >),
(TPH B <. TPH B),
(TPH C <. TPH B),
(TPH B <. TPH ABI),
(TPH C <. TPH ABJ),
(Fun1< ? extends TPH ABJ, ? super TPH C > <. TPH ABH),
(TPH ABH <. Fun1< java.lang.String, java.lang.String >),
(void <. void)]]
Dieses wird allerdings nicht vom Unify-Algorithmus aufgelöst.
Warum nicht? ConstraintSet ist doch korrekt, oder?
OLD BUG