我對Scala和Java如何交互感到困惑。例如,我正在構建一個使用Scala 2.11.6版本的Play應用程序,並且我需要一個對象來表示一個日期。由Java和Scala互相混淆
理想情況下,我想用LocalDate
從Java 8,但是這是可能的,如果斯卡拉2.11目標的Java JDK 6?
我想更好地瞭解不同版本的Java如何使用Scala工作,兩者是如何關聯的。
我對Scala和Java如何交互感到困惑。例如,我正在構建一個使用Scala 2.11.6版本的Play應用程序,並且我需要一個對象來表示一個日期。由Java和Scala互相混淆
理想情況下,我想用LocalDate
從Java 8,但是這是可能的,如果斯卡拉2.11目標的Java JDK 6?
我想更好地瞭解不同版本的Java如何使用Scala工作,兩者是如何關聯的。
斯卡拉版本和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代碼。
要回答您的具體問題,如果您使用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
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
或具有Java 7特定功能的字節碼運行,然後只能由Java 7運行或8的java
。scalac
可以通過Java 6中,7中運行,或8scalac
可以讀取的Java 6,7或8字節碼(取決於2.11 x版本.X更多或更少的Java字節碼8特徵可被讀取和使用)scalac
發射的Java 6(默認值),或Java 7(可選)字節碼scalac
只能在Java 8scalac
運行可以閱讀的Java字節碼8和7的字節碼憑藉Java的向後兼容的(我不知道的故事在這裏不管scalac
是否做出任何額外的努力以比Java 8的java
更向後兼容,例如對於Java 6的兼容性)scalac
發出的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版本,她/他的代碼可能會編譯,但是不會運行。
您可以使用'LocalDate'和'java.time。*'與scala'2.11.6'。 – Simon