Kotlinでisを使う

## Kotlinのisとは?
https://kotlinlang.org/docs/typecasts.html
>Type checks and casts

タイプチェックとキャスト

>In Kotlin, you can perform type checks to check the type of an object at runtime. Type casts convert objects to a different type.

Kotlinでは、実行時にオブジェクトの型をチェックするために型チェックを行うことができる。型キャストはオブジェクトを別の型に変換する。

公式のコードを参考にString型かチェックするif文を書いてみた。変数は`Any`なのでなんでも代入できる!

Stringの時は、isでデータ型をチェックすると、trueの処理が実行される。

```kotlin
fun main() {
    var obj: Any = "Hello"
    // if is で、String型かどうかをチェック
    if (obj is String) {
        // obj は String 型なら、length プロパティを使える
        // Hello の文字数は 5 なので、5 が出力される
        print(obj.length)
    } else {
        // obj は String 型でないので、Not a String が出力される
        print("Not a String")
    }
}
```

**実行結果**
```bash
/opt/homebrew/Cellar/openjdk/21.0.2/libexec/openjdk.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=57757:/Applications/IntelliJ IDEA CE.app/Contents/bin -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath /Users/jboy422/IdeaProjects/example/out/production/example:/Users/jboy422/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.9.22/kotlin-stdlib-jdk8-1.9.22.jar:/Users/jboy422/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib/1.9.22/kotlin-stdlib-1.9.22.jar:/Users/jboy422/.m2/repository/org/jetbrains/annotations/13.0/annotations-13.0.jar:/Users/jboy422/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.9.22/kotlin-stdlib-jdk7-1.9.22.jar MainKt
5
Process finished with exit code 0
```

変数の値を`数字の888888888`にした場合はどうなるのか...
Int型になるので、falseになりelseの処理が実行されますね。
```kotlin
fun main() {
    var obj: Any = 888888888
    // if is で、String型かどうかをチェック
    if (obj is String) {
        // obj は String 型なら、length プロパティを使える
        // Hello の文字数は 5 なので、5 が出力される
        print(obj.length)
    } else {
        // obj は String 型でないので、Not a String が出力される
        print("Not a String")
    }
}
```

**実行結果**
```bash
/opt/homebrew/Cellar/openjdk/21.0.2/libexec/openjdk.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=57889:/Applications/IntelliJ IDEA CE.app/Contents/bin -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath /Users/jboy422/IdeaProjects/example/out/production/example:/Users/jboy422/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.9.22/kotlin-stdlib-jdk8-1.9.22.jar:/Users/jboy422/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib/1.9.22/kotlin-stdlib-1.9.22.jar:/Users/jboy422/.m2/repository/org/jetbrains/annotations/13.0/annotations-13.0.jar:/Users/jboy422/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.9.22/kotlin-stdlib-jdk7-1.9.22.jar MainKt
Not a String
Process finished with exit code 0
```

!をつけるとどうなるのか...
処理が逆転する。lengthがつけれなかったのでなくして、`""`で`888888888`を囲んで文字にしてます。
```kotlin
fun main() {
    var obj: Any = "888888888"
    // if is で、String型かどうかをチェック
    if (obj !is String) {
        
        print(obj)
    } else {
        // String型のはずなんだけど、!isになってるのでこちらが実行される
        print("Not a String")
    }
}
```

**実行結果**
```bash
/opt/homebrew/Cellar/openjdk/21.0.2/libexec/openjdk.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=58507:/Applications/IntelliJ IDEA CE.app/Contents/bin -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath /Users/jboy422/IdeaProjects/example/out/production/example:/Users/jboy422/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.9.22/kotlin-stdlib-jdk8-1.9.22.jar:/Users/jboy422/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib/1.9.22/kotlin-stdlib-1.9.22.jar:/Users/jboy422/.m2/repository/org/jetbrains/annotations/13.0/annotations-13.0.jar:/Users/jboy422/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.9.22/kotlin-stdlib-jdk7-1.9.22.jar MainKt
Not a String
Process finished with exit code 0
```

## "Unsafe" cast operator﻿
>Usually, the cast operator throws an exception if the cast isn't possible. Thus, it's called unsafe. The unsafe cast in Kotlin is done by the infix operator as.

「安全でない」キャスト演算子﻿
通常、キャスト演算子はキャストが不可能な場合に例外を投げる。そのため、安全でないと呼ばれます。Kotlinのアンセーフなキャストは、infix演算子で行われます。

Kotlinでは、asキーワードを使用して型をキャストすることができます。以下にその使用例を示します。

```kotlin
fun main() {
    // y is an Any type variable
    val y: Any = "Hello, World!"
    // Cast y to String
    val x: String = y as String
    // Print x
    println(x)
}
```

このコードでは、Any型の変数yをString型にキャストしています。asキーワードを使用するときは、キャストする型が互換性があることを確認してください。互換性がない場合、実行時にClassCastExceptionがスローされます。

もし`Int`とか違うデータ型を選ぶとエラー出ます!

>Note that null cannot be cast to String, as this type is not nullable. If y is null, the code above throws an exception. To make code like this correct for null values, use the nullable type on the right-hand side of the cast:

この型はnull可能ではないので、nullをStringにキャストすることはできない。yがNULLの場合、上記のコードは例外をスローします。このようなコードでnull値を正しく扱うには、キャストの右辺にnullable型を使用します：

?をつけると、`null`を許容してくれるようだ。SwiftのOptionalみたい。これは公式の解説と違う方向に行ってる気がする。エラー出さずに実行できるようだ。nullをStringにcastはしてないようだ。

```kotlin
fun main() {
    // y is an Any type variable
    val y: Any? = null
    // Cast y to String
    val x: String? = y as String?
    // Print x
    println(x)
}
```

**実行結果**
```bash
/opt/homebrew/Cellar/openjdk/21.0.2/libexec/openjdk.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=63416:/Applications/IntelliJ IDEA CE.app/Contents/bin -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath /Users/jboy422/IdeaProjects/example/out/production/example:/Users/jboy422/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.9.22/kotlin-stdlib-jdk8-1.9.22.jar:/Users/jboy422/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib/1.9.22/kotlin-stdlib-1.9.22.jar:/Users/jboy422/.m2/repository/org/jetbrains/annotations/13.0/annotations-13.0.jar:/Users/jboy422/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.9.22/kotlin-stdlib-jdk7-1.9.22.jar MainKt
null

Process finished with exit code 0
```

## 最後に
`is`という文法を使うことがあまりなくて、Kotlinではもしかしたらよく使う場面があるのかもしれないで使ってみました。
単純にデータ型が正しいかチェックしてるだけですね。使う場面はif文以外にwhen文でも使えますね。