我正在将我的应用程序从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] 删除。
我来说两句