types推断在kotlin中失败
我在JSONArray
类上创建了一个扩展函数iterator()
,并在for循环中使用了下面的错误:
Type inferece failed: Not enough information to infer parameter T in operator fun JSONArray.iterator () L Iterator
我的代码是:
class GetFlickrJsonData(private val mCallBack: OnDataAvailable, private var mBaseUrl: String, private var mLanguage: String, private var mMatchAll: Boolean) : GetRawData.OnDownLoadComplete { init { Log.d(TAG,"GetFlickrJsonData Called") } companion object { private val TAG = "GetFlickrJsonData" } private var mPhotosList: List? = null interface OnDataAvailable { fun onDataAvailable(data: List,status: ClientInfoStatus) } fun executeOnSameThread(searchCriteria: String){ Log.d(TAG,"executeOnSameThread starts...") val destinationUri: String = createUri(searchCriteria,mLanguage,mMatchAll) val getRawData = GetRawData(this) getRawData.execute(destinationUri) Log.d(TAG,"executeOnSameThread ends...") } fun createUri(searchCriteria: String,mLanguage: String,mMatchAll: Boolean): String{ Log.d(TAG,"createUri starts...") return Uri.parse(mBaseUrl).buildUpon() .appendQueryParameter("tags",searchCriteria) .appendQueryParameter("tagmode",if(mMatchAll) "ALL" else "ANY") .appendQueryParameter("lang",mLanguage) .appendQueryParameter("format","json") .appendQueryParameter("nojsoncallback","1") .build().toString() } override fun onDownloadComplete(data: String?, status: DownloadStatus) { Log.d(TAG,"onDownLoadComplete : $status") if (status == DownloadStatus.OK) mPhotosList = ArrayList() try { val jsonData = JSONObject(data) val jsonArray: JSONArray = jsonData.getJSONArray("items") for (item: JSONObject in jsonArray){ } } }
}
扩展function是:
operator fun JSONArray.iterator(): Iterator = (0 until length()).asSequence().map { get(it) as T }.iterator()
我怎样才能明确推断它?
你有这个错误:
键入inferece失败:没有足够的信息来推断参数T in
因为generics在运行时擦除。 而当你把它扔到这里get(it) as T
到T
JVM不知道它是什么types。
所以你可以做的是使你的T reified
和functioninline
然后键入信息不会抹去。
inline operator fun JSONArray.iterator(): Iterator = (0 until length()).asSequence().map { get(it) as T }.iterator()