代数データ型という考え方があって、型に対する代数的な操作を行うものっぽいです。代数的な操作というのは、足し算とか掛け算ですね。直和型と直積型というのがあります。
直積型は構造体のようなもので、Javaだとrecordが導入されましたね。
record A(int p1, boolean p2) {}
みたいなものです。
これがなぜ積なのかというと、このレコードAの取りうる値の組み合わせは、intの値のパターン数(2 ^ 32) × booleanの値のパターン数(2)で2 ^ 33になるからなんだと思います。
直和型は、型がこれかこれ、みたいになるやつです。Javaだとtry-catchのcatch句に直和型が指定できて、この例外かこの例外、みたいな書き方ができますね。
catch (NullPointerException | NumberFormatException ex)
あとsealed classが導入されたので同じようなことができます。
sealed interface B permits C, D { } record C(int n) implements B{} record D(boolean f) implements B{}
こうすると、型Bは型Cか型Dの値を扱えることになります。このとき、型Bの取りうる値の組み合わせは、型Cの取りうる値の組み合わせ(2 ^ 32)と型Dの取りうる値の組み合わせ(2)を足したものになって2 ^ 32 + 2になります。*1
なので直和型ですね。
ということを忘れないようにメモ