Rekursiver Aufruf von Attributen Y.jav #36
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
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: JavaTX/JavaCompilerCore#36
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?
Im folgenden Programm wird das Attribut y im Konstruktor rekursiv aufgerufen.
Dies entspricht einen rekurisiven Aufruf bei der Initialisierung, was in Java zwar explizt verboten ist, aber nur durch das Frontend als Fehler abgefagen wird.
Untenstehendes Prgramm ist allerdings korrekt.
Dies wird derzeit nicht richtig in Bytecode übersetzt.
import java.util.function.*;
class Y<T,R> {
Function<Function<Function<T, R>, Function<T,R>>,Function<T,R>> y;
}
branch: bytecode2
commit:
5ddc9201f7
Y.jav und Testfile geaddet.
Mit diesem commit müsste der Typinferenz-Algorithmus die richtigen Ergebnisse ausgeben
class Y<te extends mm,
fg,
fq,
ds extends fg,
//ds extends vc,
mm extends fq
//vc extends fg
> {
Function<Function<Function<? super te, ? extends fg>,
Function<fq,ds>>,
Function<mm,ds/vc/>> y;
}
Wenn man die Trasitivität anwendet bekommt man
te extends mm,
ds extends fg,
ds extends vc,
mm extends fq
vc extends fg
nun muss man ds und vc gleichsetzen, da Mehrfachvererbung nicht möglich ist.
branch: bytecode2
commit:
37f8f2e1e0
de.dhbwstuttgart.exceptions.TypeinferenceException: Unresolved constraints: (Y<java.lang.Integer,java.lang.Integer,java.lang.Integer,java.lang.Integer,java.lang.Integer> <. Y, )
at de.dhbwstuttgart.typeinference.unify.TypeUnifyTask.compute(TypeUnifyTask.java:261)
at de.dhbwstuttgart.typeinference.unify.TypeUnifyTask.compute(TypeUnifyTask.java:1)
at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:94)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
import java.lang.Integer;
class Y {
y;
//factorial;
/*
getY() {
return y;
}
*/
}
liefert:
javap Y.class
Compiled from "Y.jav"
class Y<DPK$, DPL$, DPM$, DPN$> {
Fun1$$<Fun1$$<Fun1$
<DPL
, DPM$>, Fun1$<DPL
, DPM$>>, Fun1$<DPL
, DPM$>> y;public Y();
}
dagegen liefert
import java.lang.Integer;
class Y {
y;
//factorial;
}
das Ergebnis:
javap Y.class
Compiled from "Y.jav"
class Y<EHE$, EHF$, EHG$, EHH$> {
Fun1$$<Fun1$$<Fun1$
<EHE
, EHF$>, Fun1$<EHE
, EHF$>>, Fun1$<EHE
, EHF$>> y;public Y();
public <EGG$ extends EHE$, EFI$ extends EHF$, EGA$ extends EHE$> Fun1$$<Fun1$$<Fun1$
<EGG
, EGB$>, Fun1$<EFV
, EFI$>>, Fun1$<EGA
, EGE$>> getY();}
RICHTIG WARE:
class Y <EFQ extends EFE, EFE extends EFS, EFS,
EFJ extends EFT, EFT extends EFR, EFR> {
}