鍍金池/ 教程/ Android/ Kotlin兼容性
Kotlin內(nèi)聯(lián)函數(shù)
Kotlin開(kāi)發(fā)環(huán)境設(shè)置(Eclipse)
Kotlin調(diào)用Java代碼
Kotlin使用Ant
Kotlin編譯器插件
Kotlin相等性
Kotlin JavaScript模塊
編寫(xiě)Kotlin代碼文檔
Kotlin返回和跳轉(zhuǎn)
Kotlin異常處理
Kotlin可見(jiàn)性修飾符
Kotlin委托
Kotlin委托屬性
Kotlin編碼約定/編碼風(fēng)格
Kotlin基礎(chǔ)語(yǔ)法
使用Kotlin進(jìn)行服務(wù)器端開(kāi)發(fā)
Kotlin接口
Kotlin反射
Kotlin類型別名
Kotlin枚舉類
Kotlin當(dāng)前版本是多少?
Kotlin注解處理工具
Kotlin類型的檢查與轉(zhuǎn)換
Kotlin屬性和字段
Kotlin類型安全的構(gòu)建器
Kotlin相比Java語(yǔ)言有哪些優(yōu)點(diǎn)?
Kotlin JavaScript反射
Kotlin 是什么?
Kotlin泛型
Kotlin慣用語(yǔ)法
Kotlin與OSGi
Kotlin數(shù)據(jù)類型
Kotlin是面向?qū)ο筮€是函數(shù)式語(yǔ)言?
Kotlin動(dòng)態(tài)類型
Kotlin協(xié)程
Kotlin操作符符重載
Kotlin使用Gradle
Kotlin密封類
Kotlin兼容性
Kotlin集合
Kotlin調(diào)用JavaScript
Kotlin null值安全
Kotlin函數(shù)
Kotlin開(kāi)發(fā)環(huán)境設(shè)置(IntelliJ IDEA)
Kotlin嵌套類
Kotlin控制流程
Kotlin和Java語(yǔ)言比較
Kotlin 與 Java 語(yǔ)言兼容嗎?
Kotlin教程
Kotlin類和繼承
Kotlin對(duì)象表達(dá)式和對(duì)象聲明
JavaScript中調(diào)用Kotlin
Kotlin區(qū)間/范圍
Kotlin數(shù)據(jù)類
Kotlin lambda表達(dá)式
Kotlin是免費(fèi)的嗎?
Kotlin包
使用Kotlin進(jìn)行Android開(kāi)發(fā)
在Java中調(diào)用Kotlin代碼
Kotlin this表達(dá)式
使用Kotlin進(jìn)行JavaScript開(kāi)發(fā)
Kotlin擴(kuò)展
Kotlin解構(gòu)聲明
Kotlin注解
Kotlin使用Maven

Kotlin兼容性

本頁(yè)介紹 Kotlin 不同版本以及子系統(tǒng)的兼容性保證。

兼容性詞匯表

兼容性意味著回答這個(gè)問(wèn)題:對(duì)于給定的兩個(gè)版本的 Kotlin(例如,1.2 和 1.1.5),為一個(gè)版本編寫(xiě)的代碼可以與另一個(gè)版本一起使用嗎?下面的列表解釋了不同版本對(duì)的兼容模式。請(qǐng)注意,如果版本號(hào)較小(即使發(fā)布時(shí)間晚于版本號(hào)較大的版本)那么版本較舊。對(duì)于“舊版本”我們使用 OV,對(duì)于“新版本”使用 NV。

  • C——完全兼容(Full Compatibility)
    • 語(yǔ)言
      • 無(wú)語(yǔ)法改動(dòng)(除去 bug*)
      • 可能添加或刪除新的警告/提示
    • API(kotlin-stdlib-*、 kotlin-reflect-*)
      • 無(wú) API 改動(dòng)
      • 可能添加/刪除帶有 WARNING 級(jí)的棄用項(xiàng)
    • 二進(jìn)制(ABI)
      • 運(yùn)行時(shí):二進(jìn)制可以互換使用
      • 編譯:二進(jìn)制可以互換使用
  • BCLA——語(yǔ)言和 API 向后兼容(Backward Compatibility for the Language and API)
    • 語(yǔ)言
      • 可能會(huì)在 NV 中刪除 OV 中已棄用的語(yǔ)法
      • 除此之外,OV 中可編譯的所有代碼都可以在 NV 中編譯(除去 bug*)
      • 可能在 NV 中添加新語(yǔ)法
      • 在 NV 中可以提升 OV 的一些限制
      • 可能添加或刪除新的警告/提示
    • API(kotlin-stdlib-*、 kotlin-reflect-*)
      • 可能添加新的 API
      • 可能添加/刪除帶有 WARNING 級(jí)的棄用項(xiàng)
      • WARNING 級(jí)的棄用項(xiàng)可能在 NV 中提升到 ERROR 級(jí)或者 HIDDEN 級(jí)
  • BCB——二進(jìn)制向后兼容(Backward Compatibility for Binaries)
    • 二進(jìn)制(ABI)
      • 運(yùn)行時(shí):NV 的二進(jìn)制可以在 OV 的二進(jìn)制工作的任何地方使用
      • NV 編譯器:針對(duì) OV 二進(jìn)制編譯的代碼可針對(duì) NV 二進(jìn)制編譯
      • OV 編譯器可能不接受 NV 二進(jìn)制(例如,展示較新語(yǔ)言特性或 API 的二進(jìn)制)
  • BC——完全向后兼容(Full Backward Compatibility)
    • BC = BCLA & BCB
  • EXP——實(shí)驗(yàn)性的功能(Experimental feature)
  • NO——無(wú)兼容性保證(No compatibility guarantees)
    • 我們會(huì)盡力提供順利的遷移,但不能給出任何保證
    • 為每個(gè)不兼容的子系統(tǒng)單獨(dú)規(guī)劃遷移

* 除去 bugs 無(wú)改動(dòng)意味著如果發(fā)現(xiàn)一個(gè)重要的 bug(例如在編譯器診斷或其他地方),修復(fù)它可能會(huì)引入一個(gè)破壞性改動(dòng),但我們總是非常小心對(duì)待這樣的改動(dòng)。

Kotlin 發(fā)行版的兼容性保證

JVM 平臺(tái)的 Kotlin

  • 補(bǔ)丁版本更新(例如1.1.X)完全兼容
  • 次版本更新(例如1.X)向后兼容
Kotlin 1.0 1.0.X 1.1 1.1.X 2.0
1.0 - C BC BC ?
1.0.X C - BC BC ?
1.1 BC BC - C ?
1.1.X BC BC C - ?
2.0 ? ? ? ? -

JS 平臺(tái)的 Kotlin:從 Kotlin 1.1 開(kāi)始,補(bǔ)丁版本和次版本更新為語(yǔ)言和 API 提供向后兼容性(BCLA),但沒(méi)有 BCB。

Kotlin 1.0.X 1.1 1.1.X 2.0
1.0.X - EXP EXP EXP
1.1 EXP - BCLA ?
1.1.X EXP BCLA - ?
2.0 EXP ? ? -

Kotlin Scripts:補(bǔ)丁版本和次版本更新為語(yǔ)言和 API 提供向后兼容性(BCLA),但沒(méi)有 BCB。

跨平臺(tái)兼容性

Kotlin 可用于多個(gè)平臺(tái)(JVM/Android、JavaScript 以及即將推出的本地平臺(tái))。每個(gè)平臺(tái)都有自己的特殊性(例如 JavaScript 沒(méi)有適當(dāng)?shù)恼麛?shù)),因此我們必須相應(yīng)地調(diào)整語(yǔ)言。我們的目標(biāo)是提供合理的代碼可移植性,而不會(huì)犧牲太多。

每個(gè)平臺(tái)都可能具有特定的語(yǔ)言擴(kuò)展(例如 JVM 的平臺(tái)類型和 JavaScript 的動(dòng)態(tài)類型)或限制(例如 JVM 上與重載相關(guān)的限制),但核心語(yǔ)言保持不變。

標(biāo)準(zhǔn)庫(kù)提供了在所有平臺(tái)上可用的核心 API,我們努力使這些 API 在每個(gè)平臺(tái)上以相同的方式工作。除此之外,標(biāo)準(zhǔn)庫(kù)提供了平臺(tái)相關(guān)的擴(kuò)展(例如,JVM 的java.io 或 JavaScript 的 js())以及一些可以統(tǒng)一調(diào)用但工作方式不同的 API(例如 JVM 和 JavaScript 的正則表達(dá)式)。

實(shí)驗(yàn)性的功能

實(shí)驗(yàn)性的功能,如 Kotlin 1.1 中的協(xié)程,可以從上面列出的兼容模式中豁免。這類功能需要選擇性加入(opt-in)來(lái)使用才沒(méi)有編譯器警告。實(shí)驗(yàn)性的功能至少向后兼容補(bǔ)丁版本更新,但我們不保證任何次版本更新的兼容性(會(huì)盡可能提供遷移幫助)。

Kotlin 1.1 1.1.X 1.2 1.2.X
1.1 - BC NO NO
1.1.X BC - NO NO
1.2 NO NO - BC
1.2.X NO NO BC -

EAP 構(gòu)建版

我們發(fā)布早期訪問(wèn)預(yù)覽(Early Access Preview,EAP)構(gòu)建版到特殊渠道,該社區(qū)的早期采用者可以試用它們并提供反饋。這樣的構(gòu)建不提供任何兼容性保證(盡管我們盡最大努力保持它們與發(fā)行版以及彼此之間的合理的兼容性)。這類構(gòu)建版的質(zhì)量預(yù)期也遠(yuǎn)低于發(fā)行版。Beta 測(cè)試版本也屬于這一類別。

重要注意事項(xiàng):通過(guò) EAP 為 1.X(例如 1.1.0-eap-X)編譯的所有二進(jìn)制文件會(huì)被編譯器發(fā)行版版本拒絕。我們不希望預(yù)發(fā)布版本編譯的任何代碼在穩(wěn)定版本發(fā)布后保留。這不涉及補(bǔ)丁版本的 EAP(例如 1.1.3-eap-X),這些 EAP 產(chǎn)生具有穩(wěn)定 ABI 的構(gòu)建。

兼容性模式

當(dāng)一個(gè)大團(tuán)隊(duì)遷移到一個(gè)新版本時(shí),當(dāng)一些開(kāi)發(fā)人員已經(jīng)更新、而其他人沒(méi)有時(shí),可能會(huì)在某個(gè)時(shí)候出現(xiàn)“不一致的狀態(tài)”。為了防止前者編寫(xiě)和提交別人可能無(wú)法編譯的代碼,我們提供了以下命令行開(kāi)關(guān)(在 IDE 以及 Gradle/Maven 中也可用):

  • -language-version X.Y——Kotlin 語(yǔ)言版本 X.Y 的兼容性模式,對(duì)其后出現(xiàn)的所有語(yǔ)言功能報(bào)告錯(cuò)誤
  • -api-version X.Y——Kotlin API 版本 X.Y 的兼容性模式,對(duì)使用來(lái)自 Kotlin 標(biāo)準(zhǔn)庫(kù)(包括編譯器生成的代碼)的新版 API 的所有代碼報(bào)告錯(cuò)誤。

二進(jìn)制兼容性警告

如果使用 NV Kotlin 編譯器并在 classpath 中配有 OV 標(biāo)準(zhǔn)庫(kù)或 OV 反射庫(kù),那么可能是項(xiàng)目配置錯(cuò)誤的跡象。
為了防止編譯期或運(yùn)行時(shí)出現(xiàn)意外問(wèn)題,我們建議要么將依賴關(guān)系更新到 NV,要么明確指定 API 版本/語(yǔ)言版本參數(shù)。
否則編譯器會(huì)檢測(cè)到某些東西可能出錯(cuò),并報(bào)告警告。

例如,如果 OV = 1.0 且 NV = 1.1,你可能觀察到以下警告之一:

Runtime JAR files in the classpath have the version 1.0, which is older than the API version 1.1. 
Consider using the runtime of version 1.1, or pass '-api-version 1.0' explicitly to restrict the 
available APIs to the runtime of version 1.0.

這意味著你針對(duì)版本 1.0 的標(biāo)準(zhǔn)庫(kù)或反射庫(kù)使用 Kotlin 編譯器 1.1。這可以通過(guò)不同的方式處理:

  • 如果你打算使用 1.1 標(biāo)準(zhǔn)庫(kù)中的 API 或者依賴于這些 API 的語(yǔ)言特性,那么應(yīng)將依賴關(guān)系升級(jí)到版本 1.1。
  • 如果你想保持你的代碼與 1.0 標(biāo)準(zhǔn)庫(kù)兼容,你可以傳參 -api-version 1.0。
  • 如果你剛剛升級(jí)到 kotlin 1.1,但不能使用新的語(yǔ)言功能(例如,因?yàn)槟愕囊恍╆?duì)友可能沒(méi)有升級(jí)),你可以傳參 -language-version 1.0,這會(huì)限制所有的 API 和語(yǔ)言功能到 1.0。
Runtime JAR files in the classpath should have the same version. These files were found in the classpath:
    kotlin-reflect.jar (version 1.0)
    kotlin-stdlib.jar (version 1.1)
Consider providing an explicit dependency on kotlin-reflect 1.1 to prevent strange errors
Some runtime JAR files in the classpath have an incompatible version. Consider removing them from the classpath

這意味著你對(duì)不同版本的庫(kù)有依賴性,例如 1.1 標(biāo)準(zhǔn)庫(kù)和 1.0 反射庫(kù)。為了防止在運(yùn)行時(shí)出現(xiàn)微妙的錯(cuò)誤,我們建議你使用所有 Kotlin 庫(kù)的相同版本。在本例中,請(qǐng)考慮對(duì) 1.1 反射庫(kù)添加顯式依賴關(guān)系。

Some JAR files in the classpath have the Kotlin Runtime library bundled into them. 
This may cause difficult to debug problems if there's a different version of the Kotlin Runtime library in the classpath. 
Consider removing these libraries from the classpath

這意味著在 classpath 中有一個(gè)庫(kù),它不是作為 Gradle/Maven 依賴項(xiàng)而依賴 Kotlin 標(biāo)準(zhǔn)庫(kù),而是與它分布在同一個(gè)構(gòu)件中(即是被捆綁的)。這樣的庫(kù)可能會(huì)導(dǎo)致問(wèn)題,因?yàn)闃?biāo)準(zhǔn)構(gòu)建工具不認(rèn)為它是 Kotlin 標(biāo)準(zhǔn)庫(kù)的實(shí)例,因此它不受依賴版本解析機(jī)制的限制,你可以在 classpath 找到同一個(gè)庫(kù)的多個(gè)版本。請(qǐng)考慮聯(lián)系這樣的庫(kù)的作者,并提出使用 Gradle/Maven 依賴取代的建議。