不兼容性是指可以使用 Scala 2.13 編譯,但無法使用 Scala 3 編譯的程式碼。遷移程式碼庫包括尋找並修正原始程式碼的所有不兼容性。在罕見的情況下,我們也可能會有執行時期不兼容性:在執行時期表現不同的程式碼。
在此頁面中,我們建議對已知的不兼容性進行分類。每個不兼容性由下列內容描述
- 簡短名稱,並連結到詳細說明和建議的解決方案
- Scala 2.13 編譯器是否發出不建議使用或功能警告
- 是否有 Scala 3 遷移 規則
- 是否有可以修正它的 Scalafix 規則
Scala 2.13 不建議使用和功能警告
使用
-Xsource:3
執行 2.13 編譯,以在程式碼中找出這些不兼容性。
Scala 3 遷移與 Scalafix 重寫
Scala 3 遷移模式為開箱即用。相反地,Scalafix 是一個必須手動安裝和設定的工具。然而,Scalafix 有其自身的優點
- 它在 Scala 2.13 上執行。
- 它由個別規則組成,你可以一次套用一個規則。
- 它可以透過新增自訂規則輕鬆擴充。
語法變更
某些舊語法不再支援。
不相容性 | Scala 2.13 | Scala 3 遷移重寫 | Scalafix 規則 |
---|---|---|---|
受限關鍵字 | ✅ | ||
程序語法 | 棄用 | ✅ | ✅ |
lambda 參數周圍的括號 | ✅ | ||
傳遞引數時的大括號縮排 | ✅ | ||
錯誤的縮排 | |||
_ 作為類型參數 |
|||
+ 和 - 作為類型參數 |
已移除功能
某些功能已移除,以簡化語言。
不相容性 | Scala 2.13 | Scala 3 遷移重寫 | Scalafix 規則 |
---|---|---|---|
符號文字 | 棄用 | ✅ | |
do -while 結構 |
✅ | ||
自動應用 | 棄用 | ✅ | ✅ |
值 eta 擴充 | 棄用 | ✅ | ✅ |
any2stringadd 轉換 |
棄用 | ✅ | |
早期初始化器 | 棄用 | ||
存在類型 | 功能警告 |
情境抽象化
重新設計 情境抽象化 帶來一些明確的不相容性。
不相容性 | Scala 2.13 | Scala 3 遷移重寫 | Scalafix 規則 | 執行時期不相容性 |
---|---|---|---|---|
隱式 def 的類型 | ✅ | |||
隱式檢視 | 可能 | |||
檢視界限 | 棄用 | |||
A 和 => A 的不明確轉換 |
此外,我們已變更隱式解析規則,讓它們更有用且更令人驚訝。新規則在此 處說明。
由於這些變更,Scala 3 編譯器可能會無法解析現有 Scala 2.13 程式碼的一些隱式參數。
其他已變更功能
其他一些功能已簡化或受限,以使語言更簡單、更安全或更一致。
不相容性 | Scala 3 遷移重寫 |
---|---|
繼承遮蔽 | ✅ |
私有類別中的非私有建構函式 | 遷移警告 |
抽象覆寫 | |
案例類別伴侶 | |
明確呼叫 unapply | |
隱形的 bean 屬性 | |
=>T 作為類型引數 |
|
萬用字元類型引數 |
類型檢查器
Scala 2.13 類型檢查器在某些特定情況下不健全。這可能會在我們意想不到的地方導致令人驚訝的執行時期錯誤。Scala 3 基於更強大的理論基礎,類型檢查器中的這些不健全錯誤現在已修復。
不相容性 |
---|
變異檢查 |
模式比對 |
類型推論
Scala 2.13 和 Scala 3 之間的某些特定類型推論規則已變更。
不相容性 |
---|
覆寫方法的傳回類型 |
反射類型 |
此外,我們已透過完全重新設計來改善類型推論演算法。這個根本性的變更導致一些不相容性
- 可以推論出不同的類型
- 可能會出現新的類型檢查錯誤
明確撰寫所有公開值和方法的結果類型始終都是良好的做法。這可以防止函式庫的公開 API 因推論出不同的類型而隨著 Scala 版本而改變。
在 Scala 3 遷移之前,可以使用 Scalafix 中的 ExplicitResultTypes 規則來執行此操作。
巨集
Scala 3 編譯器無法擴充 Scala 2.13 巨集。在這種情況下,有必要使用新的 Scala 3 元程式設計功能重新實作 Scala 2.13 巨集。
您可以返回到 元程式設計 頁面,以瞭解新的元程式設計功能。