Dive into Coding Life

KotlinLearning: 01-3 型定義

30/12/2020

型定義

Kotlinは型推論をサポートしていますので、文脈上明らかな場合は型を明示的に書く必要はありませんが、静的型付きのプログラミング言語であるため、以下のようなメリットを享受できます。

パフォーマンス
信頼性
メンテナンス性
ツールサポート

またJavaとの相違点として、null許容型や関数型をサポートしています。

基本型

Kotlinでは以下の基本データ型があります。

  • String
  • Byte
  • Short
  • Int
  • Long
  • Float
  • Double
  • Char
  • Boolean

その他基本的なコレクション型として以下のデータ型があります。

  • List
  • Set
  • Map

Javaにはプリミティブ型と参照型がありましたが、Kotlinでは全て参照型です。
そのため基本データ型もメソッドを持っています。

val num: Int = 1
num.toString()

Javaバイトコードにコンパイルする際、必要があれば自動的に基本型に変換します。

静的型システム

KotlinはJavaと同様、静的型システムを採用しています。
コンパイル時に意図しない型をチェックします(IDEを使用している場合はリアルタイムでチェックします)。

全ての変数宣言には型指定が必要で、型を変更する際は明示的にキャストする必要があります。
ただし型推論を用いることにより、その多くは省略可能です。

型推論

Kotlinは初期化時に型推論をするだけでなく、強力な型推論システムを備えています。
変数定義、仮引数、実引数などあらゆる状況でコンパイラが型を推論できる場合は型の指定は省略できます。
基本的な参照型だけでなく、関数型も推測できます。

注意点として型推論を多用して書いたプログラムが果たして人間から見て読みやすいかは別の問題です。
IDEを使用すしている場合はIDEによる支援がありますが、ある程度は型を明示し、人間が読みやすくメンテナンスをしやすい明瞭なプログラムを書くようにしましょう。

型エイリアス

型情報を保存するエイリアスを宣言することができます。

機能は特にありませんが、短い名前や明確な名前を別に付けることにより、可読性をあげることができます。
例えば以下のように書くことによりPair<StepCountLog, ShareStatus>型の代わりにLogItemDataという名前を型として使うことができるようになります。

typealias LogItemData = Pair<StepCountLog, ShareStatus>

これを利用し、LiveDataなど長くなりがちな宣言文を短く書くことができます。

private val _logItem = MutableLiveData<LogItemData>()
val logItem = _logItem as LiveData<LogItemData>

そのままインスタンスを取得することもできます。

fun changeLog(data: StepCountLog, shareStatus: ShareStatus) {
    _logItem.value = LogItemData(data, shareStatus)
}

名前が長いクラスが多用される場合や、Pair、Tripleを使う際は使用を検討するとよいでしょう。
その際チーム内で情報共有をちゃんとしておきましょう。
突然現れる見たことも聞いたこともない型名の登場は混乱の原因になる可能性があります。