TL;DR
内部の構造が隠蔽された型。何を表しているかは分かるが、内部の詳細は見えない。日本語では不透明型と呼ぶ。
なぜ必要か
Wikipedia によると、不透明型は、具体的なデータ構造がインタフェースに定義されていない型である。値は、隠れた情報にアクセスできるサブルーチンを通してしか操作できないので、情報隠蔽を強制できる。
仕組み
Scala 3 の opaque type は、型を抽象化しつつ実行時のオーバーヘッドを生じさせない。型の実体は、定義したスコープの中でだけ見える。外からは別の型として扱われるので、実体の型の変数に代入しようとするとコンパイルエラーになる。値をクラスで包むわけではないので、Double などのプリミティブ型でもボクシングが起きない。
例
Scala 3 での例。LastName の実体が String であることは、DefScope の中でだけ見える。
object DefScope:
opaque type LastName = String
object LastName:
def apply(s: String): LastName = sC の標準ライブラリは、ファイルストリームを FILE へのポインタとして受け渡すが、FILE の具体的な実装は規定していない。C では、サイズやフィールドを隠した構造体を宣言でき、利用者はそのアドレス(不透明ポインタ)だけを扱う。