アッパー/ローワー境界

Scalaの型システムにおける**アッパー境界(upper bound)およびローワー境界(lower bound)**は、型パラメータに対して使用できる型の範囲を制限する仕組みです。これは、ジェネリクスと組み合わせて、安全かつ柔軟な型制約を実現するために使われます。


1. アッパー境界(Upper Bound)

概要

アッパー境界は、ある型パラメータが指定された型またはそのサブタイプであることを制約します。

構文

scala
def method[T <: UpperType](param: T): Unit = { ... }

この構文は、「TUpperType かそのサブクラスである」という制約を意味します。

scala
class Animal { def speak(): Unit = println("Some sound") } class Dog extends Animal { override def speak(): Unit = println("Woof") } def makeSpeak[T <: Animal](a: T): Unit = { a.speak() }

この場合、makeSpeak メソッドは Animal のサブタイプにのみ適用可能です。DogCatAnimal を継承していると仮定)などは使えますが、StringInt は使えません。


2. ローワー境界(Lower Bound)

概要

ローワー境界は、ある型パラメータが指定された型またはそのスーパークラスであることを制約します。

構文

scala
def method[T >: LowerType](param: T): Unit = { ... }

この構文は、「TLowerType かそのスーパークラスである」という制約を意味します。

scala
class Animal class Dog extends Animal class Puppy extends Dog def addDogToList[T >: Dog](list: List[T], dog: Dog): List[T] = { dog :: list }

この例では、TDog のスーパークラス(Dog, Animal, Any など)でなければなりません。これにより、戻り値のリストの型が Dog よりも「広い」型になることが保証されます。


3. 上限/下限を組み合わせた例

scala
def copyElements[A, B >: A](from: List[A], to: List[B]): List[B] = { from ::: to }

このように、AはBのサブタイプであるという関係性を示すことで、from の要素を to に安全にコピーすることが可能になります。


4. 使用場面と意義

  • アッパー境界は、メソッド内で利用する型に特定のメソッドやプロパティが必要なとき(例:共通のスーパークラスの機能を利用する)に使われます。

  • ローワー境界は、コレクションへの要素追加など「汎用性を持たせたいが、安全に使いたい」ときに役立ちます。


まとめ

境界の種類 構文 意味
アッパー境界 T <: SuperType T は SuperType またはそのサブクラス
ローワー境界 T >: SubType T は SubType またはそのスーパークラス

アッパー/ローワー境界は、Scalaの高度な型推論を活かしながら、安全で再利用性の高い汎用的なコードを書くための重要な仕組みです。

生成日:2025/05/04