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 TT JVM不知道它是什么types。

所以你可以做的是使你的T reified和functioninline然后键入信息不会抹去。

 inline operator fun JSONArray.iterator(): Iterator = (0 until length()).asSequence().map { get(it) as T }.iterator()