Kotlinは最初からJavaの安全で簡潔な代替手段として設計されました。その強力な側面の1つは、型推論メカニズムが発展していることです。これにより、型を損なうことなく、より冗長でないコードを書くことができます。型推論は、関数型言語(たとえば、ScalaやHaskell)や、静的型付け言語の現代的な設計トレンドに触発されました。
Javaや他の静的言語では、型を明示的に指定する必要があり、これがコードの冗長性につながります。しかし、明示的な型がないと、コードの理解が困難になり、型推論が正しく機能しなかった場合に予期しないエラーを引き起こす可能性があります。
Kotlinでは、コンパイラーが文脈から変数または式の型を自動的に推論できることがよくあります。これは、変数、関数の返り値、およびラムダ式内の式で機能します。しかし、コンパイラーが型を明示的に指定する必要がある状況もあります。たとえば、クラス内の戻り値のない関数を宣言する場合('fun doSomething()')や、式が曖昧な場合です。
コードの例:
val a = 42 // Int val s = "hello" // String fun sum(x: Int, y: Int) = x + y // 戻り値の型Intが自動的に推論される val list = listOf(1, 2, 3) // List<Int> // 値が推論できない場合は型の明示的な指定が必要 val emptyList: List<String> = emptyList() // さもなければList<Nothing>になる
主な特徴:
なぜクラスのプロパティの後でコロンの後に型を常に省略できないのですか?
プロパティが宣言された場所で初期化されていない場合(たとえば、ゲッターやinitブロックを介して)、コンパイラーは初期化子を見ないため、型を自動的に推論できません。
class User { val fullName: String // 型を明示的に指定する必要があります。さもなければエラーになります。 get() = "name" }
emptyList()を明示的な型なしで使用した場合、変数の型はどうなりますか?
List<Nothing>型が推論され、結果がほぼ無意味になります。
val list = emptyList() // List<Nothing>
型推論が関数のパラメータで機能しないのはいつですか?
関数のシグネチャでは、常にパラメータの型を明示的に指定する必要があり、さもなければコンパイラーはエラーを返します。
// エラー: // fun foo(x) = x * 2 // 正しくは: fun foo(x: Int) = x * 2
開発者がAPIからの値を返すためにemptyList()を使用する際、型を明示的に指定せず、結果としてList<Nothing>型になり、APIを使う際に問題が生じます。
メリット:
開発者は、空のコレクションを扱うときや可読性が向上する場合には常に型を明示的に指定し、その他のケースではコンパイラーの型推論に依存します。
メリット: