除非明确引用,否则Kotlin无法识别参数

在Kotlin编写一个Android项目时,有一个问题困扰着我。

当我尝试调用一些基本的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的片段,初始化加载程序没有冗长或编译器错误,然后转换为Kotlin,没有错误:

 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. } } 

上下文参数可以简单地从LoaderCallbacks接口中使用,所以你可以导入它的语句并将其作为类签名的一部分实现,如下所示:

 import android.os.Bundle import android.support.v4.app.Fragment import android.support.v4.app.LoaderManager import android.support.v4.content.Loader import android.database.Cursor class WorkSpaceActivity : Fragment(), LoaderManager.LoaderCallbacks<Cursor> { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) loaderManager.initLoader(88, null, this) } override fun onCreateLoader(id: Int, args: Bundle?): Loader<Cursor> { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } override fun onLoadFinished(loader: Loader<Cursor>?, data: Cursor?) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } override fun onLoaderReset(loader: Loader<Cursor>?) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } }