如何在Kotlin中实现java SAM接口?

0le*_*leg 2 android functional-programming kotlin functional-interface

在Java中,可以编写如下代码:

model.getObservableProduct().observe(this, new Observer<ProductEntity>() {
    @Override
    public void onChanged(@Nullable ProductEntity productEntity) {
        model.setProduct(productEntity);
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,尝试覆盖Kotlin中的本地函数会导致: 在此输入图像描述


问题:是否可以覆盖Kotlin中的本地功能?

hol*_*ava 7

尝试使用对象表达式.

//       the parentheses must be removed if Observer is an interface  ---V
model.getObservableProduct().observe(this, object:Observer<ProductEntity>(){
   override fun onChanged(productEntity:ProductEntity?) {
      model.setProduct(productEntity);
   }
});
Run Code Online (Sandbox Code Playgroud)

IFObserver是一个java SAM接口(科特林SAM接口当前不支持的),则可以使用lambda表达式代替作为进一步:

model.getObservableProduct().observe(this, Observer<ProductEntity>{
      model.setProduct(it);
});
Run Code Online (Sandbox Code Playgroud)

或者使用lambda表达式,例如:

// specify the lambda parameter type ---v
model.getObservableProduct().observe<ProductEntity>(this) {
      model.setProduct(it);
};
Run Code Online (Sandbox Code Playgroud)