除非明确引用,否则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. 
    } 

} 
+0

嘿Tynn,我刚刚更新了错误的类定义 –

上下文参数将从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. 
    } 
} 
+0

感谢您的及时答复。加入必要的进口后,这仍然不会。我已经在原帖中发布了所有上下文。 –

+0

@JoshRibeiro好吧,我查看了你的更新后的帖子,并且使用LoaderManager v4更新了我的这一次,但是仍然可以从界面中识别上下文参数...你使用的是哪个Android Studio和Kotlin插件版本?对我来说,我使用AS的最新稳定版本(2.3.3)和Kotlin版本1.1.2-5 – DaveNOTDavid

+0

我在AST 3.0的金丝雀版本3中,Kotlin版本相同 –