はじめに
この記事は「JavaからKotlinへの移行の際にこうすれば便利かな」というものを軽く纏めてみたものです。
Qiitaで初めて記事を書くので至らない点もあると思いますが、温かい目で見てもらえればと思います。
また、「ここはどうなんだ?」って所があれば教えていただけると助かります。
環境
Java: 1.8.0_281
Kotlin: 1.4.20
Integer.parseInt
, Long.parseLong
...
ユーザーから受け取った引数を数値型に変換したい時のアレです。
これにはエラー処理が含まれてないので数値型かどうか検証も見てみると良いかもしれません。
Java
String str = "123";
Int i = Integer.parseInt(str);
Long l = Long.parseLong(str);
Kotlin
val str = "123" // String
val i = str.toInt() // Int
val l = str.toLong() // Long
数値型かどうか検証
この例ではString型からInt型へのキャスト・エラーハンドリングですが、他の数値型でも同じような感じで行けます。
Java
String str = "123abc";
try {
// Int型へのキャストに成功
Int i = Integer.parseInt(str);
} catch (NumberFormatException e) {
// Int型へのキャストが失敗
System.out.println("Error!");
e.printStackTrace();
}
Kotlin
val str = "123abc" // String
val i = str.toIntOrNull() ?: kotlin.run {
// Int型へのキャストが失敗
println("Error!")
return
}
// ↓ Int型へのキャストが成功したときの処理
instanceof
Java
String str = "hogefuga";
System.out.println(str instanceof String);
// → true
Kotlin
val str = "hogefuga" // String
println(str is String)
// → true
instanceof
とキャストのあわせ技 (Smart Cast)
スマートキャストについてはこちらを見るほうが分かりやすいです。
Java
String str = "hogefuga";
if (str instanceof String) {
String msg = (String) str;
// str がString型の時
} else {
// str がString型ではない時
}
// もしくは
if (!(str instanceof String)) {
// str がString型ではない時
}
// str がString型の時
String msg = (String) str;
Kotlin
val str = "hogefuga" // String
if (str is String) {
// str がString型の時
// Kotlinではisが通った場合、自分でキャストしなくてもその型に自動でキャストしてくれます。
} else {
// str がString型ではない時
}
// もしくは
if (str !is String) {
// str がString型ではない時
}
// str がString型の時
// この場合も自動でキャストしてくれます。
// こんなのも
// String
val msg = str as? String ?: kotlin.run {
// str がString型ではない時
return
}
// str がString型の時
文献
ありがとうございます…!
Type Checks and Casts: 'is' and 'as': https://kotlinlang.org/docs/reference/typecasts.html