Ich habe versucht zu verstehen, warum die JDK 8 Lambda Expert Group (EG) beschlossen hat, keinen neuen Funktionstyp in die Java-Programmiersprache aufzunehmen.
Beim Durchgehen der Mailingliste fand ich einen Thread mit der Diskussion über das Entfernen von Funktionstypen .
Viele der Aussagen sind für mich zweideutig, möglicherweise wegen des Mangels an Kontext und in einigen Fällen wegen meines begrenzten Wissens über die Implementierung von Typensystemen.
Es gibt jedoch einige Fragen, die ich meiner Meinung nach sicher auf dieser Website formulieren kann, damit ich besser verstehe, was sie bedeuten.
Ich weiß, dass ich die Fragen in der Mailingliste stellen könnte, aber der Thread ist alt und alle Entscheidungen sind bereits getroffen, so dass die Wahrscheinlichkeit groß ist, dass ich ignoriert werde, vor allem, dass diese Jungs bereits mit ihren Plänen in Verzug geraten.
In seiner Antwort, die Entfernung von Funktionstypen zu unterstützen und die Verwendung von SAM-Typen zu befürworten, sagt Brian Goetz:
Keine Bestätigung. Es gab einen langen Thread darüber, wie nützlich es sein würde, Funktionstypen zu reifizieren. Ohne Reifizierung werden Funktionstypen gehumpelt.
Ich konnte den Thread, den er erwähnt, nicht finden. Jetzt kann ich verstehen, dass die Einführung eines strukturellen Funktionstyps gewisse Komplikationen im Java-System mit zumeist nominalen Typen mit sich bringen kann. Was ich nicht verstehen kann, ist, wie sich parametrisierte SAM-Typen in Bezug auf die Reifizierung unterscheiden.
Haben nicht beide die gleichen Probleme bei der Wiedervereinigung? Versteht jemand, wie sich Funktionstypen von parametrisierten SAM-Typen in Bezug auf die Reifizierung unterscheiden?
In einem anderen Kommentar sagt Goetz:
Es gibt zwei grundlegende Ansätze für die Typisierung: nominal und strukturell. Die Identität eines Nominalen basiert auf seinem Namen; Die Identität eines Strukturtyps hängt davon ab, woraus er besteht (z. B. "Tupel von int, int" oder "Funktion von int bis float"). Die meisten Sprachen wählen meistens nominale oder meistens strukturelle; Es gibt nicht viele Sprachen, in denen die nominelle und die strukturelle Typisierung mit Ausnahme von "um die Kanten" erfolgreich gemischt werden. Java ist fast vollständig nominell (mit wenigen Ausnahmen: Arrays sind ein Strukturtyp, aber am Ende steht immer ein nomineller Elementtyp; Generika haben auch eine Mischung aus nominell und strukturell, und dies ist in der Tat ein Teil der Quelle vieler von Beschwerden der Menschen über Generika.) Pfropfen eines Strukturtypsystems (Funktionstypen) auf Java ' Das nominelle Typensystem bedeutet neue Komplexität und Randfälle. Lohnt sich der Nutzen von Funktionstypen?
Diejenigen von Ihnen, die Erfahrung in der Implementierung von Typsystemen haben. Kennen Sie Beispiele für diese Komplexität oder Randfälle, die er hier erwähnt?
Ehrlich gesagt, verwirren mich diese Behauptungen, wenn ich bedenke, dass eine Programmiersprache wie Scala, die vollständig auf der JVM basiert, strukturelle Typen wie Funktionen und Tupel unterstützt, selbst bei den Reifizierungsproblemen der zugrunde liegenden Plattform.
Verstehen Sie mich nicht falsch, ich sage nicht, dass ein Funktionstyp besser sein sollte als die SAM-Typen. Ich möchte nur verstehen, warum sie diese Entscheidung getroffen haben.