从Java到Kotlin的代码转换后的异常:java.lang.ClassCastException:无法将java.lang.String强制转换为com.example.misc.Restaurant

阿蒙·切普里(Amon Chepri)

我正在将我的应用程序从Java转换为Kotlin,并且在执行以下代码时遇到ClassCastException。有什么想法吗?

private fun getImageFragments(imagesList: MutableList<Restaurant?>?) {

   if (imagesList != null) {

   val restaurant: Restaurant? = imagesList[0] 
/*exception: java.lang.ClassCastException:
  java.lang.String cannot be cast to com.example.misc.Restaurant */    

   }
}

不确定在这种情况下,餐厅类的实施是否重要?https://pastebin.com/q5z76exh

在使用调试器检查imagesList [0]的内容时,我看到了以下内容:

ArrayList大小= 1

    https://domainName.com/files/app/banners/1550449003515.png
    count=116
    hash:0
    shadow$_klass_=class java.lang.String
    shadow$_monitor_

而且,当我尝试将有问题的行重写为

val restaurant: String? = imagesList[0]

我正进入(状态:

Type mismatch: inferred type is Restaurant? but String? was expected

编辑:

因此,根据请求,我将发布更多代码,但是请注意,它不会很漂亮。相信我,如果它没有关闭,我很乐意向您展示整个过程,但是主要原因是我不想让您受苦。询问您是否想要更多。这是调用getImageFragments的函数的代码:

getDrawerBanners(App.preference.getString("language", "ENG"),
object : OnAPIRequestListResultListener<Restaurant?> {

    override fun onListResult(list: MutableList<Restaurant?>?) {
        bannerViewPager.adapter = fragmentManager?.
        let{ DrawerBannersAdapter(it, getImageFragments(list)) }
    }
})

这是OnAPIRequestListResultListener接口,如果您认为否则请继续阅读,我强烈感觉到错误可能隐藏在这里。

interface OnAPIRequestListResultListener<T> {
                fun onListResult(list: MutableList<T>?)
            }

原始签名+ getDrawerBanners函数的主体

 // Downloading banners  from server
    @JvmStatic
fun getDrawerBanners(languageCode: String?, listener:
OnAPIRequestListResultListener<Restaurant?>) {
    val async = GetMenuBannersAsync(listener)
    async.execute(languageCode)
}

GetMenuBannersAsync

private class GetMenuBannersAsync(var listener: 
OnAPIRequestListResultListener<Restaurant?>) : AsyncTask<String?, Void?, Void?>() {
        var bannersUrls: MutableList<Restaurant?> = ArrayList()

        override fun doInBackground(vararg params: String?): Void? {
            val url = "https://api.smartapp.com/App/Language/" + params[0]
            val client: HttpClient = DefaultHttpClient()
            val httpGet = HttpGet(url)
                httpGet.addHeader(AUTHORIZATION, AUTHORIZATION_STRING)
            var httpResponse: HttpResponse? = null
            var httpEntity: HttpEntity? = null
                httpResponse = client.execute(httpGet)
                httpEntity = httpResponse.entity
            val response = EntityUtils.toString(httpEntity)
            val json = JSONObject(response)
                // Getting drawer banner
            val bannersArray = json.getJSONArray("mainMenuBanners")
                bannersUrls = ArrayList()

            for (i in 0 until bannersArray.length()) {
                val bannerObj = bannersArray.getJSONObject(i)
                val imageUrl = bannerObj.getString("image")
                    (bannersUrls as ArrayList<String>).add(imageUrl)
            }

            return null
        }

        override fun onPostExecute(result: Void?) {
            listener.onListResult(bannersUrls)
            super.onPostExecute(result)
        }

    }
扬尼克

问题出在您的GetMenuBannersAsync职能上。在那里,您bannersUrls使用类型创建了列表,MutableList<Restaurant?>但是您使用了将值放入列表中(bannersUrls as ArrayList<String>).add(imageUrl)强制转换表达式告诉编译器您所做的转换已保存,在您的情况下不是这样。

因此,请始终记住,如果您使用强制类型转换并且类型系统将不再帮助您检测问题,那么您将独自一人。您需要确保该转换是安全的。

要解决实际问题,您需要创建Restaurant对象并将其放入列表而不是URL。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档