Reflection Kotlin绑定的可调用引用不一致

Reflection Kotlin绑定的可调用引用不一致,reflection,kotlin,Reflection,Kotlin,今天我在Android应用程序中为我的演示者创建单元测试,我注意到绑定的可调用引用存在一些不一致。它是在开发中还是语言错误?我在kotlin 1.1中发现绑定的可调用引用是受支持的。但是我的代码在kotlin 1.1.2-4中失败了 在我的presenter类中,测试过的方法从数据库中读取数据,并且dao.getAllItems()方法在视图获取列表时没有参数-->view.showData(list) 我正在使用Mockito、RxJava2和Room持久性库 class ItemsPrese

今天我在Android应用程序中为我的演示者创建单元测试,我注意到绑定的可调用引用存在一些不一致。它是在开发中还是语言错误?我在kotlin 1.1中发现绑定的可调用引用是受支持的。但是我的代码在kotlin 1.1.2-4中失败了

在我的presenter类中,测试过的方法从数据库中读取数据,并且
dao.getAllItems()
方法在视图获取列表时没有参数-->
view.showData(list)

我正在使用Mockito、RxJava2和Room持久性库

class ItemsPresenter @Inject constructor(private val itemDao: ItemDao) : Presenter<ItemsView>
{
    val TAG = this.javaClass.name!!
    private val disposables: CompositeDisposable = CompositeDisposable()
    private lateinit var view: ItemsView

    override fun onCreate(view: ItemsView)
    {
        this.view = view
    }

    override fun onDestroy()
    {
        disposables.clear()
    }

    fun onGetItems()
    {
        Observable.fromCallable(itemDao::getAllItems)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        { data -> view.showData(data) },
                        { throwable -> view.showLoadingDataError(throwable.localizedMessage) }
                )
    }
}
当我按照上述方式进行设置时,测试将顺利通过。但当我换行时
{data->view.showData(数据)}

{view::showData}

然后我的测试失败了

Wanted but not invoked:
itemsView.showData([]);
是语言错误吗?因为易受攻击的代码可以很好地编译并运行,所以它只会导致根本不调用该方法,而不会出现任何错误

为了澄清这一点,用Java8编写的代码也可以正常工作,lambda参数被正确地传递到方法引用中。正如您在Kotlin绑定的可调用引用中所看到的,当与不带参数的方法一起使用时,可以很好地工作,否则根本不会调用它们。

您应该进行更改

{ data -> view.showData(data) }

正确传入方法引用。这样,使用
()
,您将方法引用作为
subscribe
方法的参数传递


使用
{}
,您可以定义一个新函数,其中lambda将被赋予
subscribe
方法

写下

{ view::showData }
相当于

{ it -> view::showData }

这是一个忽略其参数的函数,并返回方法引用
view::showData

您是对的,这就是答案。有点误导的是,您可以将参数传递到lambda函数中,而不传递任何参数,然后实际编译代码。1.1.3将包含检测这些情况的检查:哦,这真是太好了。
{ view::showData }
{ it -> view::showData }