Scala 3 遷移指南

不兼容性表格

語言

不兼容性是指可以使用 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 巨集。

您可以返回到 元程式設計 頁面,以瞭解新的元程式設計功能。

此頁面的貢獻者