Typinferenz Probleme mit function types #361

Open
opened 2025-05-21 11:33:40 +00:00 by jschmidt · 0 comments
Collaborator

Im Zusammenhang mit function types scheint es teilweise Probleme mit der Typinferenz zu geben.
Dazu folgendes Beispielprogramm, welches alle Zahlen <=2 aus einer Liste filtert:

import java.lang.Integer;
import java.util.List;
import java.util.stream.Stream;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.ArrayList;
import java.lang.Boolean;

class Func {
    public main() {
      List<Integer> list = List.of(1,2,3,4,5);
      var func = x -> x > 2;
      var a = list.stream().filter(func).toList();
   }
}

Dieser code kompiliert in wenigen Sekunden. Wenn nun allerdings der Typ der Liste durch var ersetzt wird, rechnet der Inferenzalgorithmus mehrere Minuten, bis er terminiert.

// gleiche imports wie oben

class Func {
   public main() {
     var list = List.of(1,2,3,4,5);
     var func = x -> x > 2;
     var a = list.stream().filter(func).toList();
  }
}

Das Problem scheint mit der Verwendung der Liste in der Stream API zusammenhängen. Wenn diese Zeile entfernt wird, terminiert das Programm wieder augenblicklich.

// gleiche imports wie oben

class Func {
   public main() {
     var list = List.of(1,2,3,4,5);
     var func = x -> x > 2;
     // var a = list.stream().filter(func).toList();
  }
}

Wrappe ich z.B. die Liste in eine ArrayList, crasht das Programm auf meinem Rechner (JVM mit 2GB RAM) nur noch, weil der Heap nach einiger Zeit voll läuft. Ich denke das sollte bei so einem simplen Programm nicht sein, zumal das hier simple "lokale Typinferenz" ist, d.h. der Typ kann einfach von der Expression auf der rechten Seite übernommen werden.

// gleiche imports wie oben

class Func {
    public main() {
      var list = new ArrayList<>(List.of(1,2,3,4,5));
      var func = x -> x > 2;
      var a = list.stream().filter(func).toList();
   }
}

java.lang.OutOfMemoryError

Im Zusammenhang mit function types scheint es teilweise Probleme mit der Typinferenz zu geben. Dazu folgendes Beispielprogramm, welches alle Zahlen <=2 aus einer Liste filtert: ```java import java.lang.Integer; import java.util.List; import java.util.stream.Stream; import java.util.function.Function; import java.util.function.Predicate; import java.util.ArrayList; import java.lang.Boolean; class Func { public main() { List<Integer> list = List.of(1,2,3,4,5); var func = x -> x > 2; var a = list.stream().filter(func).toList(); } } ``` Dieser code kompiliert in wenigen Sekunden. Wenn nun allerdings der Typ der Liste durch var ersetzt wird, rechnet der Inferenzalgorithmus mehrere Minuten, bis er terminiert. ```java // gleiche imports wie oben class Func { public main() { var list = List.of(1,2,3,4,5); var func = x -> x > 2; var a = list.stream().filter(func).toList(); } } ``` Das Problem scheint mit der Verwendung der Liste in der Stream API zusammenhängen. Wenn diese Zeile entfernt wird, terminiert das Programm wieder augenblicklich. ```java // gleiche imports wie oben class Func { public main() { var list = List.of(1,2,3,4,5); var func = x -> x > 2; // var a = list.stream().filter(func).toList(); } } ``` Wrappe ich z.B. die Liste in eine ArrayList, crasht das Programm auf meinem Rechner (JVM mit 2GB RAM) nur noch, weil der Heap nach einiger Zeit voll läuft. Ich denke das sollte bei so einem simplen Programm nicht sein, zumal das hier simple "lokale Typinferenz" ist, d.h. der Typ kann einfach von der Expression auf der rechten Seite übernommen werden. ```java // gleiche imports wie oben class Func { public main() { var list = new ArrayList<>(List.of(1,2,3,4,5)); var func = x -> x > 2; var a = list.stream().filter(func).toList(); } } ``` > java.lang.OutOfMemoryError
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: JavaTX/JavaCompilerCore#361
No description provided.