クラスシャドウイング:Scala 3で廃止予定の機能(10)

Scala 3 (Dotty 0.26.0-RC1)
最終更新:2020年9月28日

[AD] scalapediaでは記事作成ボランティアを募集しています

この記事では、Scala 3で廃止されるクラスシャドウイング(Class Shadowing)について解説します。

クラスシャドウイングは廃止される

Scalaではこれまでこのようなパターンが許されていました。

class Q { class P { val x = "" } } class R extends Q { class P { val x = 4 } }

Dottyではこれはコンパイルエラーとなります。

何が問題だったのか

Scalaのクラスはオーバーライドできません。

しかし、サンプルコードにおいては見た目にはRに定義されたPQに定義されているPをオーバーライドしているように見えます。

実はオーバーライドしているわけではなく、ただ別のクラスが定義されている(上書きされている)だけなのです。

問題への対応

Dottyでは、既存の内部クラスと同名のクラスを定義できなくなりました。
これにより紛らわしいコードが生まれなくなります。

既存のコードへの影響

Scala本体、あるいは関連するライブラリにおいて、この機能はほとんど使われていませんでした。
つまり、Scala 3への移行に及ぼす影響は限定的でした。
ほかのコードでも同様と推測されます。

移行は3.0にアップデートしてからでOK

クラスシャドウイングはScala 2.13.2にて既に非推奨となっています。

そして、3.0では使用することができなくなりました。
移行オプション3.0-migrationを設定しても使用することはできません。

したがって、Scala 3.0へのアップデートの前に、クラスシャドウイングをしている箇所を修正する必要があります。

Dotty公式ドキュメントには3.0-migrationで有効化できると書いてありますが、これは実際にはそのような挙動はしないので、矛盾しています。

外部リンク:Dropped: Class Shadowing

サイト内検索