permits von sealed Interfaces funktionieren nicht wie gewünscht. #345

Closed
opened 2024-08-12 13:28:57 +00:00 by RubenKraft · 2 comments
Collaborator

Fehler

Durch das permits-Keyword können bei sealed Interfaces und Klassen explizit diejenigen Klassen angegeben werden, die das Interface implementieren oder von der Klasse erben dürfen. Derzeit werden jedoch die Klassen, die in der permits-Klausel genannt sind, nicht korrekt berücksichtigt. Daher kompiliert der folgende Code, obwohl dies eigentlich nicht der Fall sein sollte:

import java.lang.Integer;
import java.lang.Object;
import java.lang.Float;
import java.lang.String;

sealed interface List permits LinkedElem {} //Nur LinkedElem wird zur Implementierung zugelassen


public record LinkedElem(Integer a,List l) implements List{} //Implementiert List und wird auch permittet
public record Elem(Integer c) implements List{} //Implementiert List, wird aber nicht permittet

Im normalen Java-Compiler tritt folgender Fehler auf (der Fehlertext ist auf Deutsch, da die Spracheinstellungen meines Systems geändert wurden):

java: Klasse darf nicht verschlüsselte Klasse erweitern: List (da diese nicht in der "permits"-Klausel enthalten ist)

Steps to Reproduce

Den folgenden Code sowohl in Java als auch in JavaTX kompilieren:

import java.lang.Integer;
import java.lang.Object;
import java.lang.Float;
import java.lang.String;

sealed interface List permits LinkedElem {}


record LinkedElem(Integer a,List l) implements List{} //Implementiert List und wird auch permittet
record Elem(Integer c) implements List{} //Implementiert List, wird aber nicht permittet

public class Main{
    public static void main(String[] args) {
        System.out.println("test");
    }
}
## Fehler Durch das `permits`-Keyword können bei sealed Interfaces und Klassen explizit diejenigen Klassen angegeben werden, die das Interface implementieren oder von der Klasse erben dürfen. Derzeit werden jedoch die Klassen, die in der permits-Klausel genannt sind, nicht korrekt berücksichtigt. Daher kompiliert der folgende Code, obwohl dies eigentlich nicht der Fall sein sollte: ```java import java.lang.Integer; import java.lang.Object; import java.lang.Float; import java.lang.String; sealed interface List permits LinkedElem {} //Nur LinkedElem wird zur Implementierung zugelassen public record LinkedElem(Integer a,List l) implements List{} //Implementiert List und wird auch permittet public record Elem(Integer c) implements List{} //Implementiert List, wird aber nicht permittet ``` Im normalen Java-Compiler tritt folgender Fehler auf (der Fehlertext ist auf Deutsch, da die Spracheinstellungen meines Systems geändert wurden): ```java java: Klasse darf nicht verschlüsselte Klasse erweitern: List (da diese nicht in der "permits"-Klausel enthalten ist) ``` ## Steps to Reproduce Den folgenden Code sowohl in Java als auch in JavaTX kompilieren: ```java import java.lang.Integer; import java.lang.Object; import java.lang.Float; import java.lang.String; sealed interface List permits LinkedElem {} record LinkedElem(Integer a,List l) implements List{} //Implementiert List und wird auch permittet record Elem(Integer c) implements List{} //Implementiert List, wird aber nicht permittet public class Main{ public static void main(String[] args) { System.out.println("test"); } }
Owner

Stimmt, permits wird momentan komplett ignoriert. Sollte allerdings nicht so schwer sein das zu implementieren.

Stimmt, permits wird momentan komplett ignoriert. Sollte allerdings nicht so schwer sein das zu implementieren.
dholle added the
Feature Request
label 2024-08-20 10:52:16 +00:00
dholle self-assigned this 2024-08-20 10:52:20 +00:00
Owner

Wird jetzt abgefangen.

Wird jetzt abgefangen.
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#345
No description provided.