Kotlin

Kotlin M12 -> M13 移行でやったこと

More than 3 years have passed since last update.

前置き

Kotlin M13が出た!

updateしたプロジェクトでいくつかハマった問題があったのでメモ。

error対応

rxkotlinを除外

プロジェクトではRxAndroid + RxKotlinを利用していたのだけど、RxKotlinがまだM12ベースでない (2015/09/20現在) だったので、不要なエラーを招くのを阻止するために除外。
プロジェクト内で対して利用してなかったのでたいした問題にはならなかった。

Genericsの継承元にAny

たとえばこんな感じのDelegates.notNullを利用するGenericsクラスがあったのだけど。

public class DummyObserver<T> : Observer<T> {
    var count: Int = 0
    var errorCount: Int = 0
    var completed: Boolean = false
    var element: T by Delegates.notNull()

    override fun onNext(t: T) {
        element = t
        count++
    }

    override fun onError(e: Throwable?) {
        errorCount++
    }

    override fun onCompleted() {
        completed = true
    }
}

Delegates.notNullでエラー。
Delegates.notNullの宣言が変わり、<T : Any>をnotNullの返り値に利用するようにへんこうされていた。

public final fun <T : kotlin.Any> notNull(): kotlin.properties.ReadWriteProperty<kotlin.Any?, T> { /* compiled code */ }
- public class DummyObserver<T> : Observer<T> {
+ public class DummyObserver<T : Any> : Observer<T> {

としてあげることで回避した。

warning対応

Delegates.lazy -> lazy

Delegates.lazyがdepreatedになっていた。
かわりにlazyを使う。

-    val hoge: Int by Delegates.lazy { 1 }
+    val hoge: Int by lazy { 1 }

annotation

@ なしのAnnotationを利用するとwarningsが出るようになった。

data class Hoge(
-    JsonProperty("user_id")
+    @JsonProperty("user_id")
    val userId: String
)

あと小文字のannotationがdeprecatedになっていた。

+            is Boolean -> { @Suppress("UNCHECKED_CAST") return pref.getBoolean(key, defaultValue) as T }
-            is Boolean -> { @suppress("UNCHECKED_CAST") return pref.getBoolean(key, defaultValue) as T }

java() => T::class.java

deprecated.
主にretrofitで利用していた。

.splitBy -> .split

deprecated.

.sortBy -> .sortedBy

deprecated.

assert(Boolean, message) => assert(Boolean, lazyMessage)

deprecated.
遅延メッセージ推奨になっていた。

- assert(false, "message")
+ assert(false, { "message" })