##1. 事象
「Androidアプリ開発の教科書 Kotlin対応(初版第2刷)」を写経しています。
サンプルプログラムの中で、 ジェネリックのmutablMap<String, Any>で、ポリモフィズムがうまく機能しない事象を見つけました。
( p179 第8章 リストビューのカスタマイズ リスト8.3より必要と思われる部分を抜粋し、事象を説明します。)
ソースコードの抜粋を示します。
Kotlin
1fun main(args: Array<String>) { 2 val menuList: MutableList<MutableMap<String, Any>> = mutableListOf() 3 var menu = mutableMapOf("name" to "唐揚げ定食", "price" to 800, "desc" to "若鳥の唐揚げにサラダ") 4 menuList.add(menu) 5}
3行目の部分にあるmenuの型は推定の結果、“var menu: MutableMap<String, out {Comparable*> & java.io.Serializable}>”です。
このMutableMapの要素menuを4行目のmenuListに追加しようとした際に、型が合わない(Kotlin: Type mismatch: inferred type is MutableMap<String, out {Comparable<*> & java.io.Serializable}> but MutableMap<String, Any> was expected
)とエラーを出力しました。
##2.質問
menuListは型が MutableList<MutableMap<String, Any>>なので、型がMutableMap<String, out {Comparable> & java.io.Serializable}>であるmenuListにmenuを追加できると思うのですがエラーになってしまいます。
Anyはすべての型の親なのに、なぜout {Comparable> & java.io.Serializable}>**を受け入れることができないのでしょうか?
(なお、半年か1年ほど前に写経した同じサンプルプログラムが現存していますが、それは今でもエラーを出力しません。Androidのプロジェクトに含まれているbuild.gradle(Project)を調べてみると当時のKotlinコンパイラのバージョンは1.3.72で、現在のは1.4.32です。もしかするとコンパイラが原因でしょうか?)
##3.応急対応
次のように3行目の変数menuの型を“:MutableMap<String, Any>”と指定することで、エラーは解消されました。
var menu:MutableMap<String, Any> = mutableMapOf("name" to "唐揚げ定食", "price" to 800, "desc" to "若鳥の唐揚げにサラダ")
ご指導のほど、よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/16 04:17