Scalaの型システムにおける**アッパー境界(upper bound)およびローワー境界(lower bound)**は、型パラメータに対して使用できる型の範囲を制限する仕組みです。これは、ジェネリクスと組み合わせて、安全かつ柔軟な型制約を実現するために使われます。
1. アッパー境界(Upper Bound)
概要
アッパー境界は、ある型パラメータが指定された型またはそのサブタイプであることを制約します。
構文
この構文は、「T は UpperType かそのサブクラスである」という制約を意味します。
例
この場合、makeSpeak メソッドは Animal のサブタイプにのみ適用可能です。Dog や Cat(Animal を継承していると仮定)などは使えますが、String や Int は使えません。
2. ローワー境界(Lower Bound)
概要
ローワー境界は、ある型パラメータが指定された型またはそのスーパークラスであることを制約します。
構文
この構文は、「T は LowerType かそのスーパークラスである」という制約を意味します。
例
この例では、T は Dog のスーパークラス(Dog, Animal, Any など)でなければなりません。これにより、戻り値のリストの型が Dog よりも「広い」型になることが保証されます。
3. 上限/下限を組み合わせた例
例
このように、AはBのサブタイプであるという関係性を示すことで、from の要素を to に安全にコピーすることが可能になります。
4. 使用場面と意義
-
アッパー境界は、メソッド内で利用する型に特定のメソッドやプロパティが必要なとき(例:共通のスーパークラスの機能を利用する)に使われます。
-
ローワー境界は、コレクションへの要素追加など「汎用性を持たせたいが、安全に使いたい」ときに役立ちます。
まとめ
| 境界の種類 | 構文 | 意味 |
|---|---|---|
| アッパー境界 | T <: SuperType |
T は SuperType またはそのサブクラス |
| ローワー境界 | T >: SubType |
T は SubType またはそのスーパークラス |
アッパー/ローワー境界は、Scalaの高度な型推論を活かしながら、安全で再利用性の高い汎用的なコードを書くための重要な仕組みです。
生成日:2025/05/04