Android studio 如何将Java方法引用代码转换为Kotlin

Android studio 如何将Java方法引用代码转换为Kotlin,android-studio,kotlin,java-8,android-livedata,method-reference,Android Studio,Kotlin,Java 8,Android Livedata,Method Reference,我用Java编写了以下代码: mViewModel.getSetupData().observe(this, this::updateTime); updateTime方法接受一个参数。 将此代码转换为Kotlin时,以下操作不起作用: mViewModel?.getSetupData()?.observe(this, ::updateTime) IDE(android studio)抱怨 类型不匹配。所需:观察员。找到KFunction1 有什么线索吗?看来你可以提供 .observe(t

我用Java编写了以下代码:

mViewModel.getSetupData().observe(this, this::updateTime);
updateTime方法接受一个参数。 将此代码转换为Kotlin时,以下操作不起作用:

mViewModel?.getSetupData()?.observe(this, ::updateTime)
IDE(android studio)抱怨

类型不匹配。所需:观察员。找到KFunction1


有什么线索吗?

看来你可以提供

.observe(this, Observer { someClass ->
    /*Here you can call your method*/
})

是的,它比java方法要详细一点,但由于soe原因Kotlin无法推断lambda的类型。

对于任何面临相同问题的人,这需要是来自Android LiveData api的Kotlin
val
。它不可能是一个函数。以下是
updateTime
的正确代码,它可以代替函数:

    private val updateTime = Observer<TimeMeasurement> { 
      setupTimeMeasurement ->
      // Update the UI, in this case, a TextView.
      updateTimerData(setupTimeMeasurement, mViewModel!!.currentTimeValue)
}

出于某些原因,Kotlin在提供
observe
重载方面不够聪明:

// Java declaration
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer)
下面是调用的区别:

// reusable observer object
val myObserver = Observer<TimeMeasurement> { updateTime(it) }

// function that updates time
fun updateTime(time : TimeMeasurement){
    // update views with time
}

override fun onCreate(savedInstanceState: Bundle?) {
    /* ... */

    // default call [ #1 ]
    mViewModel.liveData.observe(this, myObserver)
    // default call but with object expression for observer [ #1 ]
    mViewModel.liveData.observe(this, Observer { updateTime(it) })
    // alternatively [ #1 ]
    mViewModel.liveData.observe(this, Observer(::updateTime))

    // SAM conversions, lets us pass function reference or a lambda [ #2 ]
    // in this case first argument is a lambda as well and it returns lifecycle
    mViewModel.liveData.observe({ lifecycle }, ::updateTime)

    // extension function call where we pass function reference as second argument [ #3 ]
    mViewModel.liveData.observe(this, ::updateTime)
    // or using lambda [ #3 ]
    mViewModel.liveData.observe(this) { updateTime(it) }
}
//可重用的观察者对象
val myObserver=Observer{updateTime(it)}
//更新时间的函数
乐趣更新时间(时间:TimeMeasurement){
//随时间更新视图
}
重写创建时的乐趣(savedInstanceState:Bundle?){
/* ... */
//默认呼叫[#1]
mViewModel.liveData.observe(这是myObserver)
//默认调用,但对象表达式为observer[#1]
mViewModel.liveData.observe(this,observator{updateTime(it)})
//或者[1]
mViewModel.liveData.observe(this,observator(::updateTime))
//SAM转换,让我们传递函数引用或lambda[#2]
//在本例中,第一个参数也是lambda,它返回lifecycle
mViewModel.liveData.observe({lifecycle},::updateTime)
//将函数引用作为第二个参数传递的扩展函数调用[#3]
mViewModel.liveData.observe(this,::updateTime)
//或者使用lambda[#3]
观察(this){updateTime(it)}
}

谢谢,但它仍然抱怨类型不匹配。这是observe的签名:
observe(@NonNull LifecycleOwner owner,@NonNull Observer确切的错误消息是什么?语法看起来不错。尝试使用gradle进行构建。有时IDE重新启动有助于解决类型推断问题。问题源于这样一个事实:这需要是一个Kotlin
val
androidx.lifecycle.Observer,而不是一个函数。感谢提供不同的示例。您的代码中的
crossinline
到底是什么?这是来自Android KTX的代码片段。
crossinline
是来自observer body的。
// Default Kotlin conversion [ #1 ]
fun observe(owner : LifecycleOwner, observer : Observer<in T>)

// SAM conversions [ #2 ]
fun observe(owner: () -> Lifecycle, observer : (T) -> Unit)
// custom extension with function observer argument [ #3 ]
@MainThread inline fun <T> LiveData<T>.observe(
    owner: LifecycleOwner,
    crossinline onChanged: (T) -> Unit
): Observer<T> {
    val wrappedObserver = Observer<T> { t -> onChanged.invoke(t) }
    observe(owner, wrappedObserver)
    return wrappedObserver
}
// reusable observer object
val myObserver = Observer<TimeMeasurement> { updateTime(it) }

// function that updates time
fun updateTime(time : TimeMeasurement){
    // update views with time
}

override fun onCreate(savedInstanceState: Bundle?) {
    /* ... */

    // default call [ #1 ]
    mViewModel.liveData.observe(this, myObserver)
    // default call but with object expression for observer [ #1 ]
    mViewModel.liveData.observe(this, Observer { updateTime(it) })
    // alternatively [ #1 ]
    mViewModel.liveData.observe(this, Observer(::updateTime))

    // SAM conversions, lets us pass function reference or a lambda [ #2 ]
    // in this case first argument is a lambda as well and it returns lifecycle
    mViewModel.liveData.observe({ lifecycle }, ::updateTime)

    // extension function call where we pass function reference as second argument [ #3 ]
    mViewModel.liveData.observe(this, ::updateTime)
    // or using lambda [ #3 ]
    mViewModel.liveData.observe(this) { updateTime(it) }
}