[targetBytecode] TestThreeArgs #95

Open
opened 2023-01-10 14:54:30 +00:00 by dholle · 1 comment
Owner

Das Beispiel ist als TestThreeArgs.jav in resources/insertGenericsJav definiert.

Das erste Problem ergibt sich wenn für die Methode "id" die Infima eliminiert werden:

vorher: [(TPH AF < TPH W), (TPH W = java.lang.Object), (TPH P < TPH AF), (TPH Q < TPH W), (TPH Q < TPH P)]

nachher: [(TPH EAY < TPH AF), (TPH AF < TPH EAY), (TPH Q < TPH EAY)]

es ergibt sich also ein neuer cycle der nicht entfernt wird.

Das zweite Problem ist, dass in Methode "m", durch die Gleichsetzung von AA (= W) und der neuen Typvariablen EAY, die Typvariable der anderen Methode "geklaut" wird.

public class TestThreeArgs {
public N a;

public TestThreeArgs() {
}

public <EAY extends AF, AF extends EAY, Q extends EAY> AF id(EAY var1) {
    ...
}

public <AB extends AC, W, AC> EAY m(EAY var1, AB var2, AC var3) {
    ...
}

}

"m" sollte nicht auf EAY verweisen.

Das Beispiel ist als TestThreeArgs.jav in resources/insertGenericsJav definiert. Das erste Problem ergibt sich wenn für die Methode "id" die Infima eliminiert werden: vorher: [(TPH AF < TPH W), (TPH W = java.lang.Object), (TPH P < TPH AF), (TPH Q < TPH W), (TPH Q < TPH P)] nachher: [(TPH EAY < TPH AF), (TPH AF < TPH EAY), (TPH Q < TPH EAY)] es ergibt sich also ein neuer cycle der nicht entfernt wird. Das zweite Problem ist, dass in Methode "m", durch die Gleichsetzung von AA (= W) und der neuen Typvariablen EAY, die Typvariable der anderen Methode "geklaut" wird. public class TestThreeArgs<N> { public N a; public TestThreeArgs() { } public <EAY extends AF, AF extends EAY, Q extends EAY> AF id(EAY var1) { ... } public <AB extends AC, W, AC> EAY m(EAY var1, AB var2, AC var3) { ... } } "m" sollte nicht auf EAY verweisen.
Owner

M.E. müsste folgendes rauskommen:

public class TestThreeArgs {
public N a;

public TestThreeArgs() {
}

public <EAY extends AF, AF, A> AF id(EAY b) {
    A a /*= null*/;
    AF c = b;
    m(a,a,b);
    return c;
}

public <AB extends EAY, EAY, AC> EAY m(EAY x, AB y, AC z) {
     x = id(y);
    return x;
}

}

M.E. müsste folgendes rauskommen: public class TestThreeArgs<N> { public N a; public TestThreeArgs() { } public <EAY extends AF, AF, A> AF id(EAY b) { A a /*= null*/; AF c = b; m(a,a,b); return c; } public <AB extends EAY, EAY, AC> EAY m(EAY x, AB y, AC z) { x = id(y); return x; } }
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#95
No description provided.