在尝试在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,我刚刚更新了错误的类定义 –