Subtyping Problem bei Konstruktoren #302

Closed
opened 2024-03-22 15:15:57 +00:00 by i21023 · 0 comments
Collaborator

Beim Aufruf von Konstruktoren scheint es ein Problem mit Subtypen zu geben.

Beispiel:

import java.util.ArrayList;
import java.util.List;
import java.lang.Integer;

class Foo{

    public Foo(List<Integer> a){}

    static bar(){
        new Foo(new ArrayList<Integer>());
    }
}

Dieser Code kompiliert, führt aber zu einem Laufzeitfehler, da der Konstruktor mit dem Typ ArrayList statt List aufgerufen wird. Da es diesen Konstruktor nicht gibt wirft die JVM einen NoSuchMethodError.

11: invokespecial #20                 // Method "<init>":(Ljava/util/ArrayList;)V

Auszug aus dem Bytecode der Methode static bar();

Dieses Problem scheint allerdings lediglich bei Konstruktoren aufzutreten, bei Methoden funktioniert der Aufruf mit Subtypen wie erwartet.

import java.util.ArrayList;
import java.util.List;
import java.lang.Integer;

class Foo{

    public foo(List<Integer> a){}

    static bar(){
        new Foo().foo(new ArrayList<Integer>());
    }
}

Hier wird die Methode foo korrekt mit dem Typ List aufgerufen.

14: invokevirtual #21                 // Method foo:(Ljava/util/List;)V
Beim Aufruf von Konstruktoren scheint es ein Problem mit Subtypen zu geben. **Beispiel:** ```java import java.util.ArrayList; import java.util.List; import java.lang.Integer; class Foo{ public Foo(List<Integer> a){} static bar(){ new Foo(new ArrayList<Integer>()); } } ``` Dieser Code kompiliert, führt aber zu einem Laufzeitfehler, da der Konstruktor mit dem Typ `ArrayList` statt `List` aufgerufen wird. Da es diesen Konstruktor nicht gibt wirft die JVM einen `NoSuchMethodError`. ``` 11: invokespecial #20 // Method "<init>":(Ljava/util/ArrayList;)V ``` *Auszug aus dem Bytecode der Methode `static bar();`* Dieses Problem scheint allerdings lediglich bei Konstruktoren aufzutreten, bei Methoden funktioniert der Aufruf mit Subtypen wie erwartet. ```java import java.util.ArrayList; import java.util.List; import java.lang.Integer; class Foo{ public foo(List<Integer> a){} static bar(){ new Foo().foo(new ArrayList<Integer>()); } } ``` Hier wird die Methode `foo` korrekt mit dem Typ `List` aufgerufen. ``` 14: invokevirtual #21 // Method foo:(Ljava/util/List;)V ```
dholle referenced this issue from a commit 2024-03-25 13:49:25 +00:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 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#302
No description provided.