2016-02-25 60 views
1

我對Scala和Java如何交互感到困惑。例如,我正在構建一個使用Scala 2.11.6版本的Play應用程序,並且我需要一個對象來表示一個日期。由Java和Scala互相混淆

理想情況下,我想用LocalDate從Java 8,但是這是可能的,如果斯卡拉2.11目標的Java JDK 6?

我想更好地瞭解不同版本的Java如何使用Scala工作,兩者是如何關聯的。

+0

您可以使用'LocalDate'和'java.time。*'與scala'2.11.6'。 – Simon

回答

0

斯卡拉版本和Java版本是不同的:你可以在不同的Java版本(例如1.6,1.7,1.8)運行相同版本的Scala(讓說2.10.5)。

但是如果你使用JSE類型的特定於JVM版本,您的Scala代碼將無法與以前的Java版本上運行。就好像你使用provided依賴關係構建Scala應用程序/庫,而不需要運行時提供它。此外,如果根據配置的Java版本由scalac生成的字節碼比JRE(在Java 8中編譯但是用JRE 1.6執行)中的一個更新,則它不能被解釋爲任何普通的Java代碼。

3

要回答您的具體問題,如果您使用JDK8運行scalac,那麼您可以使用LocalDate與Scala 2.11。

至於更一般的問題,還有是相互分離的四種基本方法Scala和Java的互動版本聰明(至少在理論上)。

  • 在編譯時間,java一些版本必須運行scalac
  • 在編譯時,scalac讀取JVM字節碼
  • 在編譯時的一些版本,scalac發出JVM字節碼
  • 在一些版本運行時,java(通過scala腳本)運行JVM字節碼scalac發出。

讓我們看看如何堆疊起來斯卡拉2.10.5的scalac,斯卡拉2.11.x的scalac,以及即將到來的Scala 2.12.x的scalac和Java 6,7,和8

  • 斯卡拉2.10.5:
    • scalac可以通過Java 6中,7或8(由於java的向後兼容性)
    • scalac CA運行n讀取的Java 6或7字節碼
    • scalac發射的Java 6(缺省值),或者用於特定的Scala零件7(可選)字節碼,但如果它讀取的Java字節碼7(例如因爲您使用的是Java 7庫),那麼您的最終產品也會包含Java 7字節碼,並由Java 6字節碼調用。
    • 根據您在上一步中的行爲,您將擁有純Java 6字節碼,然後可以通過Java 6,7或8的java或具有Java 7特定功能的字節碼運行,然後只能由Java 7運行或8的java
  • 的Scala 2.11.x:
    • scalac可以通過Java 6中,7中運行,或8
    • scalac可以讀取的Java 6,7或8字節碼(取決於2.11 x版本.X更多或更少的Java字節碼8特徵可被讀取和使用)
    • scalac發射的Java 6(默認值),或Java 7(可選)字節碼
    • 同樣的故事爲2.10.5這裏
  • 斯卡拉2.12.x:
    • scalac只能在Java 8
    • scalac運行可以閱讀的Java字節碼8和7的字節碼憑藉Java的向後兼容的(我不知道的故事在這裏不管scalac是否做出任何額外的努力以比Java 8的java更向後兼容,例如對於Java 6的兼容性)
    • scalac發出的Java 8字節碼
    • 的Java 8的java必須用來運行生成的二進制

只是要強調的是,在理論上,這些步驟都完全解耦,斯卡拉2.12的scalac假設可以通過Scala 2.11的scalac編譯生成scalac,它可以由Java 6運行,但其結果輸出只能由Java 8 java運行。

對於Scala 2.11,只要您將這些類提供給scalac,就可以使用Java 8。關於LocalDate的唯一特別之處在於它與Java平臺捆綁在一起,因此如果您使用Java 8運行scalac並且如果使用Java 6或7運行scalac,則隱式地訪問它。如果您使用的是第三方平臺,您可以將編譯的JAR提供給Scala 2.11.x scalac以使用,而不管運行哪個Java版本scalac。該字節碼可能會進入您自己的發射JAR,這可能會使下游用戶的事情複雜化。

這意味着對於任何非純粹的Scala項目,您必須讓您的客戶知道用於您生成的任何JAR的Scala版本和Java版本。如果你的項目是一個庫,並且你的消費者使用兼容的Scala版本,但是不兼容的Java版本,她/他的代碼可能會編譯,但是不會運行。