在嘗試在Kotlin中編寫Android項目時,存在一個困擾我的問題。除非明確引用,否則Kotlin無法識別參數
當我嘗試調用一些基本的Android庫函數時,編譯器要求非常具體的引用。這是一個LoaderManager初始化的例子。記下最後一個參數。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
loaderManager.initLoader(LOADER_ROUTINE, arguments, this as android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>)
}
這是奇怪的部分。如果我做一個基於Java的片段,初始化加載程序並不繁瑣或編譯器錯誤,然後轉換爲科特林,沒有錯誤:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
loaderManager.initLoader(88, arguments, this)
}
我在想什麼。 Kotlin需要避免必須採取什麼樣的環境,將第一個示例中的添加爲WhateverSpecificClass?
編輯:這是一些額外的上下文。編譯過程中特定的錯誤是:
Type inference failed:
fun <D : Any!> initLoader
(id: Int,
args: Bundle!,
callback: LoaderManager.LoaderCallbacks<D!>!)
: Loader<D!>!
cannot be applied Int,
Bundle!,
EditRoutine
)
的片段
package com.inviscidlabs.ero.Fragments
import android.app.LoaderManager
import android.content.ContentValues
import android.content.Context
import android.content.CursorLoader
import android.content.Loader
import android.database.Cursor
import android.os.Bundle
import android.support.design.widget.TextInputEditText
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import butterknife.BindView
import butterknife.ButterKnife
import com.inviscidlabs.ero.Data.EroProvider
import com.inviscidlabs.ero.Data.Keys
import com.inviscidlabs.ero.Data.Routine
import com.inviscidlabs.ero.R
class EditRoutine : Fragment(), LoaderManager.LoaderCallbacks<Cursor>{
//Values
private val LOADER_ROUTINE: Int = 9150
//Vars
private var mRoutineID: String? = null
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
//If the routineID passed is a legitimate ID, initialize the loader
if(!mRoutineID.equals(Keys.m_NullValue)){
// this would not work: loaderManager.initLoader(LOADER_ROUTINE, arguments, this)
loaderManager.initLoader(LOADER_ROUTINE, arguments, this as android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>)
}
}
//Loader Functions
override fun onCreateLoader(id: Int, args: Bundle): Loader<Cursor>? {
if(id==LOADER_ROUTINE){
val projection = arrayOf(Routine.Table._ID, Routine.Table.KEY_NAME)
val selection = Routine.Table._ID + "=?"
val selectionArgs = arrayOf(args.getString(Keys.b_RoutineID))
val cL = CursorLoader(activity, //Context
EroProvider.CONTENT_URI_WORKOUT, //URI
projection, //The fields we want (must include ID
selection, //WHERE statement for SQL
selectionArgs, null)//Arguments for WHERE
return cL
}
return null
}
override fun onLoaderReset(loader: Loader<Cursor>?) {
}
override fun onLoadFinished(loader: Loader<Cursor>?, data: Cursor?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
嘿Tynn,我剛剛更新了錯誤的類定義 –