2016/12/13の30分 Kotlinメモ🐝

2016/12/13の30分 Kotlinメモ🐝

書いてるコードは雑にここにあります。

github.com

引き続き Calling Java code from Kotlin読んでる

https://kotlinlang.org/docs/reference/java-interop.html#getters-and-setterskotlinlang.org

Mapped types

Javaの型がKotlinの型にどうマッピングされるか書いてある。

興味深いのはCollectionの扱い。

JavaのCollectionは(Mutable)Collection<T>!型になると。。。

Listなら(Mutable)List<T>!ね。

ということは、以下のコードみたいにJavaで不変なListを作った場合に、Kotlinから見ると(Mutable)List<T>!になるから、変更できるように見れるかー。

public class JavaJava {

    public List<String> getList() {
        return new ArrayList<>();
    }

    public List<String> getUnmodifiableList() {
        return Collections.unmodifiableList(new ArrayList<>());
    }
}

// Kotlin
fun run() {
    val java = JavaJava()
    println(java.list) // (Mutable)List<T>!

    // JavaからKotlinへ不変なListであることは伝えられない??
    java.unmodifiableList.add("") // UnsupportedOperationException
}

JavaからKotlinへ不変なListであることは伝えられない??

頻繁に困る問題ではなさそうだけど...なくはないかなーと。

Java Arrays

とりあえずざっくり読んで、ほえーってなった。

読んでおくと良さそう。

Nullability annotations

JavaからのNullの扱い。

@Nullable@NotNullJavaのメソッドなどにつければ、Kotlinで参照する時にKotlin Typesになるよってこと。

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class JavaJava {

    @Nullable
    public String getNullableObject() {
        return null;
    }

    @NotNull
    public String getNotNullableObject() {
        return "not null";
    }
}


// Kotlin
val java = JavaJava()

// @NullableをつけることでPlatform TypesじゃなくてKotlin typesになる
println(java.nullableObject?.toUpperCase())

// @NotNullをつけることでPlatform TypesじゃなくてKotlin typesになる
println(java.notNullableObject.toUpperCase())

Kotlinやりぞ!って気持ちがあったりする人々は、Javaのコードに積極的に付けていくと良さそう。

Optionalも変換してくれると嬉しいけどなー

import java.util.Optional;

public class JavaJava {

    public Optional<String> getStringOptional() {
        return Optional.empty();
    }
}

// Kotlin
val java = JavaJava()

// String?とかになってほしい...
java.stringOptional.ifPresent { println(it) }

対応してるannotationsの種類なドキュメント見るなり、Kotlin compiler source code見るなりしてねーってらしい。

github.com

Androidcom.android.annotationsandroid.support.annotationsも対応してるのか。嬉しい。

まとめ

Optional氏〜🤔