型推論

Scalaの「型推論(Type Inference)」は、変数や式に明示的な型を指定しなくても、コンパイラが自動的に適切な型を推論してくれる機能です。これにより、コードの記述が簡潔になりつつも、静的型付けの恩恵(型安全性や補完機能など)を受けることができます。


1. 基本的な型推論の例

Scalaでは以下のように、変数に型を明示しなくても、自動的に推論されます。

scala
val x = 10 // Int型と推論される val y = 3.14 // Double型と推論される val name = "Scala" // String型と推論される

このように、右辺の値(リテラル)をもとに型が決まるため、明示的に型を書く必要がない場合も多いです。


2. 関数における型推論

関数定義でも、戻り値の型は推論されます。

scala
def add(a: Int, b: Int) = a + b

この場合、a + b の結果が Int なので、戻り値の型は Int と推論されます。ただし、再帰関数の場合は型推論が効かないため、戻り値の型を明示する必要があります。

scala
// OK: 戻り値が明示されている def factorial(n: Int): Int = if (n == 0) 1 else n * factorial(n - 1) // エラー: 再帰関数では戻り値型が必要 // def factorial(n: Int) = if (n == 0) 1 else n * factorial(n - 1)

3. var に対する推論

val だけでなく var にも型推論は適用されます。ただし、var は再代入可能なため、一度決まった型は変更できません

scala
var count = 5 // Int型と推論される count = 10 // OK // count = "five" // エラー: Stringは代入できない

4. 型推論の限界と注意点

型推論は便利ですが、以下のようなケースでは明示的な型指定が推奨されます。

  • APIの戻り値が分かりづらい場合

  • 抽象的な型(例えば関数型)を返す場合

  • 可読性や保守性を高めたい場合

例:

scala
// 戻り値の型を明示すると可読性が向上 def square(x: Int): Int = x * x

まとめ

特徴 説明
静的型付け Scalaは静的型言語だが、型推論により柔軟な記述が可能
型の省略 明確な右辺があれば、型を省略してもよい
再帰関数 戻り値の型は必ず明示する必要がある
可読性の考慮 複雑な型や公開APIでは型を明示したほうがよい

生成日:2025/05/04