除非明确引用,否则Kotlin无法识别参数
在尝试在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.
}
}
上下文参数将从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.
}
}
感谢您的及时答复。加入必要的进口后,这仍然不会。我已经在原帖中发布了所有上下文。 –
@JoshRibeiro好吧,我查看了你的更新后的帖子,并且使用LoaderManager v4更新了我的这一次,但是仍然可以从界面中识别上下文参数...你使用的是哪个Android Studio和Kotlin插件版本?对我来说,我使用AS的最新稳定版本(2.3.3)和Kotlin版本1.1.2-5 – DaveNOTDavid
我在AST 3.0的金丝雀版本3中,Kotlin版本相同 –
嘿Tynn,我刚刚更新了错误的类定义 –