Substitution ? ext/sup TPH [TPH -> ? ext/sup Type] funktioniert nicht/ Problem in SetWildcardType #165
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