2017-06-13 27 views
0

在嘗試在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,我剛剛更新了錯誤的類定義 –

回答

0

上下文參數將從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版本相同 –