Tph2.jav #86

Open
opened 2022-08-08 09:49:17 +00:00 by pl · 3 comments
Owner

commit: 56f68e84e4

Folgendes Ergebnis kommt:

javap Tph2.class 
public class Tph2<WH> {
  public Fun1$$<WH, WH> id;
  public Tph2();
  public <U extends DZG> WH id3(U);
}

Es müsste aber
public class Tph2<WG> {
  public Fun1$$<WG, WG> id;
  public Tph2();
  public <U extends WG> WG id3(U);
}

Es gilt doch

cs'_Tph2 = {
(TPH DCI < TPH DZF),
(TPH WG < TPH DCI)
}

cs'_id3 = {
(TPH U < TPH WG),
}

Eliminate inner type variables
cs'_Tph2 = {
(TPH WG < TPH DZF),
}

Equalize type variables in contravariant and covariant position
TPH DZF -> TPH WG

Dann müsste genau das Ergebnis rauskommen.

Zur Dokumentation

RESULT Final: [[(TPH M = Fun1$$<TPH WG, TPH DZF>), (TPH O, TPH DCI), (TPH S = Tph2), (TPH WH, TPH DZF), (TPH U < TPH WG), (TPH X, TPH DZF), (TPH DCI < TPH DZF), (TPH DZG, TPH WG), (TPH V = Tph2), (TPH T, TPH DZF), (TPH R = Fun1$$<TPH DCI, TPH DCI>), (TPH N, TPH DCI), (TPH WG < TPH DCI)]]
Simplified constraints: [(TPH U < TPH DZG), (TPH O < TPH WH), (TPH DZG < TPH O)]
id3: [(TPH U < TPH DZG)]
Class Tph2: [(TPH WH = java.lang.Object)]

class Tph2 {

  TPH M id;
Tph2()({
    super(());
    ((this)::TPH S.id)::TPH M = ((TPH N x) -> ({
      return (x)::TPH N;
    })::TPH O)::TPH R;
  })::TPH AF
  TPH T id3(TPH U x)({
    return (((this)::TPH V.id)::TPH M.apply((x)::TPH U))::TPH X;
  })::TPH Z

  Tph2()({
    super(());
  })::TPH AC

}
commit: 56f68e84e49658e686630b33952f895204b89273 Folgendes Ergebnis kommt: ``` javap Tph2.class public class Tph2<WH> { public Fun1$$<WH, WH> id; public Tph2(); public <U extends DZG> WH id3(U); } Es müsste aber public class Tph2<WG> { public Fun1$$<WG, WG> id; public Tph2(); public <U extends WG> WG id3(U); } Es gilt doch cs'_Tph2 = { (TPH DCI < TPH DZF), (TPH WG < TPH DCI) } cs'_id3 = { (TPH U < TPH WG), } Eliminate inner type variables cs'_Tph2 = { (TPH WG < TPH DZF), } Equalize type variables in contravariant and covariant position TPH DZF -> TPH WG Dann müsste genau das Ergebnis rauskommen. Zur Dokumentation RESULT Final: [[(TPH M = Fun1$$<TPH WG, TPH DZF>), (TPH O, TPH DCI), (TPH S = Tph2), (TPH WH, TPH DZF), (TPH U < TPH WG), (TPH X, TPH DZF), (TPH DCI < TPH DZF), (TPH DZG, TPH WG), (TPH V = Tph2), (TPH T, TPH DZF), (TPH R = Fun1$$<TPH DCI, TPH DCI>), (TPH N, TPH DCI), (TPH WG < TPH DCI)]] Simplified constraints: [(TPH U < TPH DZG), (TPH O < TPH WH), (TPH DZG < TPH O)] id3: [(TPH U < TPH DZG)] Class Tph2: [(TPH WH = java.lang.Object)] class Tph2 { TPH M id; Tph2()({ super(()); ((this)::TPH S.id)::TPH M = ((TPH N x) -> ({ return (x)::TPH N; })::TPH O)::TPH R; })::TPH AF TPH T id3(TPH U x)({ return (((this)::TPH V.id)::TPH M.apply((x)::TPH U))::TPH X; })::TPH Z Tph2()({ super(()); })::TPH AC } ```
Owner

[targetBytecode]

Zwei Probleme. Zum Ersten wurde bei dem Umwandeln des ResultPairs in TargetGenerics die Gleichsetzung der Typvariablen nicht beachtet, das habe ich gefixt.

Das zweite Problem war, dass der Lambdaausdruck die falschen Typen hatte.
Hier ist das korrekte Ergebnis:

public class Tph2<LWLA> {
    public Fun1$$<LWLA, LWLA> id = this::lambda$0;

    public Tph2() {
    }

    public LWLA lambda$0(LWLA var1) {
        return var1;
    }

    public <LQTY extends LWLA> LWLA id3(LQTY var1) {
        return this.id.apply(var1);
    }
}

Der Lambda ausdruck hatte vorher den Typ LVCC.
Im result set stand mal LVCC < LWLA, das ist aber rausgefallen weil es sich um innere Typvariablen gehandelt hat. Ich habe dann LVCC = LWLA gesetzt und das hat das Problem beseitigt. Ich bin mir aber nicht sicher ob das die richtige Lösung ist, man könnte auch alternativ das LVCC < LWLA behalten.

[targetBytecode] Zwei Probleme. Zum Ersten wurde bei dem Umwandeln des ResultPairs in TargetGenerics die Gleichsetzung der Typvariablen nicht beachtet, das habe ich gefixt. Das zweite Problem war, dass der Lambdaausdruck die falschen Typen hatte. Hier ist das korrekte Ergebnis: ``` public class Tph2<LWLA> { public Fun1$$<LWLA, LWLA> id = this::lambda$0; public Tph2() { } public LWLA lambda$0(LWLA var1) { return var1; } public <LQTY extends LWLA> LWLA id3(LQTY var1) { return this.id.apply(var1); } } ``` Der Lambda ausdruck hatte vorher den Typ LVCC. Im result set stand mal LVCC < LWLA, das ist aber rausgefallen weil es sich um innere Typvariablen gehandelt hat. Ich habe dann LVCC = LWLA gesetzt und das hat das Problem beseitigt. Ich bin mir aber nicht sicher ob das die richtige Lösung ist, man könnte auch alternativ das LVCC < LWLA behalten.
Author
Owner

Das müssen wir besprechen. Kann ich so nicht beantworten

Das müssen wir besprechen. Kann ich so nicht beantworten
Author
Owner

Hier die erwartete Lösung

class Tph2<ADK extends DKK, DKK extends EWR, EWR> {
    
        Fun1$$<ADK, EWR>
        id = x->x;

	<V extends ADK>
	EWR id3 (V x) {
    	   	return id.apply(x);
    	}
}
Hier die erwartete Lösung ``` class Tph2<ADK extends DKK, DKK extends EWR, EWR> { Fun1$$<ADK, EWR> id = x->x; <V extends ADK> EWR id3 (V x) { return id.apply(x); } } ```
dholle added the
generics
label 2024-03-05 10:38:04 +00:00
dholle removed the
in progress
label 2024-03-05 10:56:17 +00:00
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#86
No description provided.