😮

KotlinのAny型はJavaのObject型の代わりじゃない!?

2021/12/10に公開

はじめにお断り

実務で役に立つ記事ではないです。たまたま見かけた記事にkotlinの世界ではJavaのObject型が使えること+Javaの世界と同じように扱えないことが書かれていたので実験的に試してみたというお話になります。

代わりじゃないの?

koltinのソースコードにObjectと定義できるように代わりというか別のもの同士として共存しています。

同じじゃないの?

IntelliJのJava -> Koltinの自動変換機能を当てると次のような変換が行われます

// Java
final List<Object> sampleList = new ArrayList<>();
// ↓
val sampleList: List<Any> = java.util.ArrayList()

Object=Anyと思えるかもしれませんがちょっと勝手が違うみたいです。

こちらの記事がとても参考になりました
https://qiita.com/koher/items/d9411a00986f14683a3f#any-と-any

val sampleList: MutableList<Object> = ArrayList()
sampleList.add("value") // コンパイルエラー
sampleList.add(10) // コンパイルエラー

kotlinでは全ての型のルート型はAny型でありJavaのObject型とは継承関係にないと判定されてしまうために上記はコンパイルエラーになってしまう模様です。

上記のコンパイルを通すには明示的にObject型にキャストしてやればいけます。

sampleList.add("value" as Object)
sampleList.add(10 as Object)

まとめ

おそらくKotlinの世界でObject型を使わなければならない場面に遭遇することはないので
素直にAny型に置き換えておきなさいという結論ですね。(IntelliJも警告してくれますので)

Discussion