Überschreiben von Methoden mit primitiven Typen #294

Closed
opened 2024-03-15 15:03:34 +00:00 by i21023 · 3 comments
Collaborator

Da in JavaTX primitive Datentypen durch ihre Wrapper-Klassen ersetzt werden, kommt es zu problematischem Verhalten, wenn man Methoden von Oberklassen überschreiben will, da die eigentliche Methode nicht überschrieben wird, sondern eine Überladung mit neuen Typ stattfindet. Hier beispielhaft die versuchte Überladung der Methode equals(Object o) von Object

import java.lang.Object;
import java.lang.Boolean;

class Foo{
    public boolean equals(Object o){
        return true;
    }
}

Da primitive Datentyp boolean durch java.lang.Boolean substituiert wird, wird boolean equals(Object o) nicht überschrieben, sondern mit java.lang.Boolean equals(Object o) "überladen"

$ javap  Foo
class Foo {
  public Foo();
  public java.lang.Boolean equals(java.lang.Object);
  public static {};
}

Ich bin mir nicht sicher, ob das Probleme macht, wenn ein Projekt nur mit JavaTX kompiliert wird, aber wenn man ein Hybridprojekt aus javac und javatx verwendet wird, beschwert sich der javac Kompiler, dass er die Methode nicht überschreiben kann, weil die Signatur abweicht.

javatx-src/main/java/de/dhbwstuttgart/syntaxtree/type/SuperWildcardType.java:19: Fehler: SuperWildcardType ist nicht abstrakt und setzt die abstrakte Methode equals(Object) in RefTypeOrTPHOrWildcardOrGeneric nicht außer Kraft
public class SuperWildcardType extends WildcardType{
       ^
javatx-src/main/java/de/dhbwstuttgart/syntaxtree/type/SuperWildcardType.java:77: Fehler: equals(Object) in SuperWildcardType kann nicht equals(Object) in RefTypeOrTPHOrWildcardOrGeneric außer Kraft setzen
        public boolean equals(Object o) {
                       ^
  Rückgabetyp boolean ist nicht mit Boolean kompatibel
javatx-src/main/java/de/dhbwstuttgart/syntaxtree/type/TypePlaceholder.java:19: Fehler: TypePlaceholder ist nicht abstrakt und setzt die abstrakte Methode equals(Object) in RefTypeOrTPHOrWildcardOrGeneric nicht außer Kraft
public class TypePlaceholder extends RefTypeOrTPHOrWildcardOrGeneric
       ^
javatx-src/main/java/de/dhbwstuttgart/syntaxtree/type/TypePlaceholder.java:68: Fehler: equals(Object) in TypePlaceholder kann nicht equals(Object) in RefTypeOrTPHOrWildcardOrGeneric außer Kraft setzen
    public boolean equals(Object obj)
                   ^
  Rückgabetyp boolean ist nicht mit Boolean kompatibel
Da in JavaTX primitive Datentypen durch ihre Wrapper-Klassen ersetzt werden, kommt es zu problematischem Verhalten, wenn man Methoden von Oberklassen überschreiben will, da die eigentliche Methode nicht überschrieben wird, sondern eine Überladung mit neuen Typ stattfindet. Hier beispielhaft die versuchte Überladung der Methode `equals(Object o)` von Object ```java import java.lang.Object; import java.lang.Boolean; class Foo{ public boolean equals(Object o){ return true; } } ``` Da primitive Datentyp `boolean` durch `java.lang.Boolean` substituiert wird, wird `boolean equals(Object o)` nicht überschrieben, sondern mit `java.lang.Boolean equals(Object o)` "überladen" ``` $ javap Foo class Foo { public Foo(); public java.lang.Boolean equals(java.lang.Object); public static {}; } ``` Ich bin mir nicht sicher, ob das Probleme macht, wenn ein Projekt nur mit JavaTX kompiliert wird, aber wenn man ein Hybridprojekt aus javac und javatx verwendet wird, beschwert sich der javac Kompiler, dass er die Methode nicht überschreiben kann, weil die Signatur abweicht. ``` javatx-src/main/java/de/dhbwstuttgart/syntaxtree/type/SuperWildcardType.java:19: Fehler: SuperWildcardType ist nicht abstrakt und setzt die abstrakte Methode equals(Object) in RefTypeOrTPHOrWildcardOrGeneric nicht außer Kraft public class SuperWildcardType extends WildcardType{ ^ javatx-src/main/java/de/dhbwstuttgart/syntaxtree/type/SuperWildcardType.java:77: Fehler: equals(Object) in SuperWildcardType kann nicht equals(Object) in RefTypeOrTPHOrWildcardOrGeneric außer Kraft setzen public boolean equals(Object o) { ^ Rückgabetyp boolean ist nicht mit Boolean kompatibel javatx-src/main/java/de/dhbwstuttgart/syntaxtree/type/TypePlaceholder.java:19: Fehler: TypePlaceholder ist nicht abstrakt und setzt die abstrakte Methode equals(Object) in RefTypeOrTPHOrWildcardOrGeneric nicht außer Kraft public class TypePlaceholder extends RefTypeOrTPHOrWildcardOrGeneric ^ javatx-src/main/java/de/dhbwstuttgart/syntaxtree/type/TypePlaceholder.java:68: Fehler: equals(Object) in TypePlaceholder kann nicht equals(Object) in RefTypeOrTPHOrWildcardOrGeneric außer Kraft setzen public boolean equals(Object obj) ^ Rückgabetyp boolean ist nicht mit Boolean kompatibel ```
Owner

Das ist ein interessantes Problem. Ich würde warscheinlich @Override in irgendeiner Form einführen, hier könnte dann überprüft werden ob primitive Datentypen verwendet werden müssen damit das Overriding klappt.

Das ist ein interessantes Problem. Ich würde warscheinlich @Override in irgendeiner Form einführen, hier könnte dann überprüft werden ob primitive Datentypen verwendet werden müssen damit das Overriding klappt.
Author
Collaborator

Das ist ein interessantes Problem. Ich würde warscheinlich @Override in irgendeiner Form einführen, hier könnte dann überprüft werden ob primitive Datentypen verwendet werden müssen damit das Overriding klappt.

Ich denke auch die @Override Annotation zu verwenden wäre eine gute Lösung. So könnte der Compiler dann auch prüfen, ob alle abstrakten Funktionen der Superklasse/Interface auch wirklich implementiert werden. Aktuell wird man dazu nicht gezwungen

> Das ist ein interessantes Problem. Ich würde warscheinlich @Override in irgendeiner Form einführen, hier könnte dann überprüft werden ob primitive Datentypen verwendet werden müssen damit das Overriding klappt. Ich denke auch die @Override Annotation zu verwenden wäre eine gute Lösung. So könnte der Compiler dann auch prüfen, ob alle abstrakten Funktionen der Superklasse/Interface auch wirklich implementiert werden. Aktuell wird man dazu nicht gezwungen
dholle added the
confirmed
label 2024-03-18 12:56:34 +00:00
Owner

Wir sind jetzt so verblieben, dass wir das Ganze transparent machen. Also wenn in der Superklasse irgendwo eine Methode existiert die sich nur in der Verwendung von primitiven Typen unterscheidet, wird diese Methode überschrieben. JavaTX verwendet hier also die primitiven Typen.

Wir sind jetzt so verblieben, dass wir das Ganze transparent machen. Also wenn in der Superklasse irgendwo eine Methode existiert die sich nur in der Verwendung von primitiven Typen unterscheidet, wird diese Methode überschrieben. JavaTX verwendet hier also die primitiven Typen.
dholle added the
Codegen
in progress
labels 2024-03-20 12:29:53 +00:00
dholle referenced this issue from a commit 2024-03-20 13:37:27 +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#294
No description provided.