Play Billing 5.0.0 Kotlin:如何重写onProductDetailsResponse()?
问题解答
没错,Java和Kotlin在这里的写法差异确实是语言特性导致的:
- Java 必须显式实现
ProductDetailsResponseListener接口并重写onProductDetailsResponse方法,因为Java不支持单抽象方法(SAM)的简化转换。 - Kotlin 支持SAM转换,对于只有一个抽象方法的接口,可直接用lambda表达式替代接口实现,不需要显式写
override fun onProductDetailsResponse()。
举个实际写法对比:
Java写法(必须实现接口)
queryProductDetailsAsync(params, new ProductDetailsResponseListener() { @Override public void onProductDetailsResponse(BillingResult billingResult, List<ProductDetails> productDetailsList) { // 处理结果逻辑 } });
Kotlin写法(用lambda简化)
queryProductDetailsAsync(params) { billingResult, productDetailsList -> // 处理结果逻辑 }
你添加override fun onProductDetailsResponse()时提示“nothing to override”,是因为你的类并没有实现ProductDetailsResponseListener接口,自然没有可重写的方法。如果一定要用接口实现的方式,也可以显式声明:
class MyBillingListener : ProductDetailsResponseListener { override fun onProductDetailsResponse(billingResult: BillingResult, productDetailsList: List<ProductDetails>) { // 处理结果逻辑 } } // 调用时传入实例 queryProductDetailsAsync(params, MyBillingListener())
但这种写法在Kotlin里属于冗余写法,官方示例用lambda就是为了简化代码。
内容的提问来源于stack exchange,提问作者Yanay Lehavi
相关产品推荐
相关产品推荐

