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, инициализирую загрузчик без многословия или ошибки компилятора, а затем преобразую в Kotlin, ошибки нет:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    loaderManager.initLoader(88, arguments, this)

}

Чего мне не хватает Какой контекст необходим Kotlin, чтобы избежать необходимости обходить пути добавления класса Wh whatSpecificClass из первого примера?

Редактировать: вот дополнительный контекст. Конкретная ошибка во время компиляции:

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

}

1 ответ

Решение

Параметр context будет просто использоваться из интерфейса 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.
    }
}
Другие вопросы по тегам