/ / Kompatibilita medzi uzávermi Scala a uzávermi Java 8 - java, scala, uzávery, scala-java-interop

Kompatibilita uzáverov Scala a uzáverov Java 8 - java, scala, uzávery, scala-java-interop

Po prečítaní niektorých záznamov v zozname adries OpenJDKzdá sa, že vývojári Oracle v súčasnosti ďalej odstraňujú veci z návrhu na ukončenie, pretože skoršie chyby v dizajne v jazyku Java komplikujú zavedenie uzávierok Java.

Vzhľadom na to, že uzávery Scaly sú omnoho viacvýkonné ako uzávery plánované pre Java 8, zaujímalo by ma, či to bude možné napr. g. zavolať metódu Java, ktorá zavrie program Scala, definuje uzáver v jazyku Java a dá ho funkcii Scala atď.?

Takže budú uzávierky Java zobrazené ako ich náprotivky Scala v bajtovom kóde alebo inak? Bude možné vyplniť medzeru vo funkčnosti medzi uzávermi Java / Scala?

odpovede:

2 pre odpoveď č. 1

Poznámka: o 5 rokov neskôr, SCALA 2.12.0-M3 (október 2015) obsahovalo toto vylepšenie:

Scala 2.12 emituje uzávery v rovnakom štýle ako Java 8.

Pre každú lambdu kompilátor vygeneruje metódu obsahujúcu telo lambda.
Za behu sa táto metóda odovzdáva ako argument pre LambdaMetaFactory poskytované JDK, ktoré vytvára uzatvárací objekt.

V porovnaní s programom Scala 2.11 má nová schéma tú výhodu, že kompilátor už negeneruje anonymnú triedu pre každú lambdu. To vedie k výrazne menším súborom JAR.


15 pre odpoveď č. 2

Myslím si, že je to komplikovanejšie, než keby sa predpokladali dve skupiny zainteresovaných strán. Projekt Lambda zdá sa, že ľudia pracujú väčšinou nezávisle od ľudí Oracle, občas hádzať niečo cez stenu ktoré ľudia projektu Lambda zistia nepriamo. (Scala je samozrejme tretia zúčastnená strana.)

Vzhľadom k tomu, najnovší návrh projektu Lambda znamená úplne odstrániť typy funkcií a iba vytvoriť nejaký efektný odvod na implementáciu rozhraní, ktoré majú jedinú a abstraktnú metódu (SAM typy), predpokladám nasledovné:

  • Volanie kódu Scala, ktoré vyžaduje ukončenie systému Scala, bude úplne závisieť od implementácie protokolu Function* - (a implementácia znakov vvšeobecne) - či sa javí prekladaču Java ako SAM (ktorý je v Scala-land) alebo či sa ne-abstraktné metódy javia ako abstraktné pre JVM. (Myslím si, že v súčasnosti vyzerajú, že sú „abstraktné“, pretože vlastnosti sú implementované ako rozhrania, ale o implementácii Scaly neviem takmer nič. Mohlo by to byť veľkou prekážkou vzájomnej prepojiteľnosti.)

    Komplikácie s generikami Java (najmä ako ich vyjadriťInt/int/Integer, alebo Unit/Nothing/void vo všeobecnom rozhraní) môžu veci komplikovať.

  • Používanie funkcií Scala na implementáciu Java SAM sa nebude líšiť od súčasného stavu - musíte si vytvoriť implicit konverzia pre konkrétne rozhranie, ktoré chcete implementovať.

Ak JVM získa typy funkcií (a objaví sa Oracleaby nevylúčili túto možnosť), môže to závisieť od toho, ako je implementovaná. Ak ide o prvotriedne objekty implementujúce konkrétne rozhranie, potom je všetko, čo musí urobiť Scala, aby bol kompatibilný, vyrobené. Function* implementovať nové rozhranie. Ak je v JVM implementovaný úplne nový typ, mohlo by to byť ťažké - vývojári Scaly ich môžu zabaliť pomocou mágie, ako v súčasnosti pre Arrays, alebo môžu vytvoriť vytvoriť implicit konverzie. (Nový jazykový koncept sa zdá byť trochu pritiahnutý za vlasy.)

Dúfam, že jedným z výsledkov celej tejto diskusie je to všetko rôznych jazykov JVM sa dohodne na nejakom štandardnom spôsobe reprezentácie uzávierok - takže Scala, Groovy, JRuby, atď. ... môžu všetky uzávierky prechádzať tam a späť s minimálnymi problémami.

Čo je pre mňa zaujímavejšie, sú návrhy na metódy virtuálneho rozšírenia ktorý umožní používanie rozhrania API Java CollectionsLambda. V závislosti od toho, ako sú implementované, môžu značne zjednodušiť niektoré binárne problémy s kompatibilitou, s ktorými sme sa museli pri zmene kódu Scala vyrovnať, a môžu pomôcť ľahšie a efektívnejšie implementovať vlastnosti.

Dúfam, že niektorí vývojári Scaly súzapojiť sa a ponúknuť svoje príspevky, ale v skutočnosti som nevidel žiadnu diskusiu o Scale v zozname projektov Lambda ani žiadnych účastníkov, ktorí na mňa skočia ako vývojári Scaly.


7 pre odpoveď č. 3

Pravdepodobne by ste to dokázali urobiť veľmi ľahko implicitné konverzie a la collection.JavaConversions či pochádzajú z krabice.

Samozrejme, že je samozrejme nie, pretože to môže byť prípad, keď sa zatváranie Java zmení na typy, ktoré generuje JVM pri behu - Zdá sa, že si spomínam na prezentáciu Neala Gaftera, ktorá hovorí v tomto zmysle