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

Java 除非明确引用,否则Kotlin无法识别参数,java,android,kotlin,android-loadermanager,Java,Android,Kotlin,Android Loadermanager,在尝试用Kotlin编写Android项目时,有一个问题让我感到困惑 当我试图调用一些基本的Android库函数时,编译器要求提供非常具体的引用。下面是一个初始化LoaderManager的示例。注意最后一个参数 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) loaderManager.initLoader(LOADER_ROUTI

在尝试用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>)
   }
我错过了什么。Kotlin需要什么样的上下文来避免不得不在第一个示例中添加as WhateverSpecificClass的工作环境

编辑:这里是一些额外的上下文。编译期间的具体错误是:

    Type inference failed: 

fun <D : Any!> initLoader
(id: Int,
 args: Bundle!,
 callback: LoaderManager.LoaderCallbacks<D!>!)
: Loader<D!>!
cannot be applied Int,
Bundle!,
EditRoutine
)
类型推断失败:
有趣的初始化加载程序
(id:Int,
args:捆绑!,
回调:LoaderManager.LoaderCallbacks!)
:加载器!
不能应用于Int,
捆
编辑程序
)
片段的整个包装代码

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

}
包com.invisidlabs.ero.Fragments
导入android.app.LoaderManager
导入android.content.ContentValues
导入android.content.Context
导入android.content.CursorLoader
导入android.content.Loader
导入android.database.Cursor
导入android.os.Bundle
导入android.support.design.widget.text输入文本
导入android.support.v4.app.Fragment
导入android.view.LayoutInflater
导入android.view.view
导入android.view.ViewGroup
导入butterknife.BindView
进口毛刀
导入com.invisidlabs.ero.Data.EroProvider
导入com.invisidlabs.ero.Data.Keys
导入com.invisidlabs.ero.Data.Routine
导入com.invisidlabs.ero.R
类EditRoute:Fragment(),LoaderManager.LoaderCallbacks{
//价值观
专用val加载器_例程:Int=9150
//瓦尔斯
私有变量mRoutineID:字符串?=null
覆盖活动创建的乐趣(savedInstanceState:Bundle?){
super.onActivityCreated(savedInstanceState)
//如果传递的routineID是合法ID,则初始化加载程序
如果(!mRoutineID.equals(Keys.m_NullValue)){
//这不起作用:loaderManager.initLoader(LOADER_例程、参数、this)
initLoader(LOADER_例程、参数,如android.support.v4.app.loaderManager.LoaderCallbacks)
}
}
//加载器功能
重写onCreateLoader(id:Int,args:Bundle):Loader{
if(id==LOADER\u例程){
val projection=arrayOf(例程.Table.\u ID,例程.Table.KEY\u名称)
val选择=例行程序.表格。\u ID+“=?”
val selectionArgs=arrayOf(args.getString(Keys.b_RoutineID))
val cL=CursorLoader(活动,//上下文
EroProvider.CONTENT\u URI\u锻炼,//URI
投影,//我们需要的字段(必须包括ID
所选内容,//SQL的WHERE语句
selectionArgs,null)//WHERE的参数
返回cL
}
返回空值
}
覆盖有趣的onLoaderReset(加载程序:加载程序?){
}
覆盖乐趣onLoadFinished(加载程序:加载程序?,数据:光标?){
TODO(“未实现”)//要更改已创建函数的主体,请使用文件|设置|文件模板。
}
}

上下文参数将仅从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.
    }
}
导入android.os.Bundle
导入android.support.v4.app.Fragment
导入android.support.v4.app.LoaderManager
导入android.support.v4.content.Loader
导入android.database.Cursor
类WorkSpaceActivity:Fragment(),LoaderManager.LoaderCallbacks{
覆盖活动创建的乐趣(savedInstanceState:Bundle?){
super.onActivityCreated(savedInstanceState)
initLoader(88,null,this)
}
重写FunonCreateLoader(id:Int,args:Bundle?):Loader{
TODO(“未实现”)//要更改已创建函数的主体,请使用文件|设置|文件模板。
}
覆盖乐趣onLoadFinished(加载程序:加载程序?,数据:光标?){
TODO(“未实现”)//要更改已创建函数的主体,请使用文件|设置|文件模板。
}
覆盖有趣的onLoaderReset(加载程序:加载程序?){
TODO(“未实现”)//要更改已创建函数的主体,请使用文件|设置|文件模板。
}
}

感谢您的及时回复。添加必要的导入后,这仍然不需要。我已在原始帖子中发布了所有上下文。@JoshRibeiro好的,我查看了您更新的帖子,这次也使用LoaderManager v4更新了我的帖子,但是,从界面上仍然可以识别上下文参数……什么你使用的是io和Kotlin插件版本吗?对我来说,我使用的是AS的最新稳定版本(2.3.3)和Kotlin版本1.1.2-5我在AST 3.0的canary build 3中,同一Kotlin版本你的解决方案指出了这个问题。我导入了v4.Fragment而不是Fragment。这就解决了问题!嘿,Tynn,我刚刚更新了错误的类定义
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.
    }
}