😮
KotlinのAny型はJavaのObject型の代わりじゃない!?
はじめにお断り
実務で役に立つ記事ではないです。たまたま見かけた記事に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と思えるかもしれませんがちょっと勝手が違うみたいです。
こちらの記事がとても参考になりました
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