Substitution ? ext/sup TPH [TPH -> ? ext/sup Type] funktioniert nicht/ Problem in SetWildcardType #165

Closed
opened 2015-03-06 11:34:10 +00:00 by pl · 5 comments
Owner

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.

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.
Author
Owner

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.

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.
Owner

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)

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)
Author
Owner

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 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.
Owner

(In reply to Martin Plümicke from comment #3)

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.

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?

(In reply to Martin Plümicke from comment #3) > 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. 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?
Owner

OLD BUG

OLD BUG
Sign in to join this conversation.
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: JavaTX/JavaCompilerCore#165
No description provided.