在Kotlin lambda表达式中重写多个接口方法

说我有两个方法onCurrentLocationonErrorCallbacks接口:

  public interface Callbacks { void onCurrentLocation(ClientLocation location); void onError(); } 

和一个在它的构造函数中接受这个接口的类,说:

 public MyLocationClient(Callbacks callbacks) {...} 

现在,在Kotlin中,我应该如何能够实例化MyLocationClient:

 val myLocationClient = MyLocationClient( { location: ClientLocation -> updateClientLocation(location) }, {}) 

如果没有,为什么不呢?

我看到的行为是:当接口只有一个方法,这个对象的构造罚款。 但是,只要我添加更多的方法Callbacks ,编译器抱怨

“Type mismatch。Required:Callbacks!Found:(ClientLocation) – > Unit”

编辑:删除空位检查的location因为它是不相关的问题。

我想这是一件好事,它不起作用,因为当接口有两个相同类型的函数时,你做了什么?

 public interface Callbacks { void anotherFunction(ClientLocation location); void onCurrentLocation(ClientLocation location); } 

所以限制这个SAM(单抽象方法)接口是一个好方法,我会说。

所以你要创建一个匿名类的实例,它不是一个函数接口(它们只有一个方法),所以它会是这样的:

 val myLocationClient = MyLocationClient(object : Callbacks { override fun onCurrentLocation(location : ClientLocation?){ location?.let{ updateLocation(it) } } override fun onError(){ // should you not handle errors? } }) 

你可以定义

 class CallbacksImpl(private val onCurrentLocationF: (ClientLocation) -> Unit, private val onErrorF: () -> Unit) : Callbacks { override fun onCurrentLocation(location : ClientLocation) { onCurrentLocationF(location) } override fun onError() { onErrorF() } } 

并使用它

 MyLocationClient(CallbacksImpl( { location -> updateClientLocation(location) }, {})) 

它仍然有一些样板,但每个接口一次,而不是每次使用一次,所以它可以很容易地是一个很好的折衷。

 interface IAnimatedRatingBar { fun setProgressImageResource(resourceId: Int) fun setProgressImageDrawable(drawable: Drawable) fun setSecondaryProgressImageResource(resourceId: Int) fun setSecondaryProgressImageDrawable(drawable: Drawable) fun startAnimate() } 

这对我来说很好。