Android转Kotlin最佳实践:Java子类转Kotlin后方法引用报错解决
问题分析与解决方案
核心问题
- IDE自动转换的Kotlin代码采用了纯Kotlin属性风格,原Java的
getAbbreviation()方法在Kotlin中被替换为直接属性访问,无需手动调用getter方法 - 你的调用代码存在拼写错误:
getAbbrevation()少了字母i,且getLangaugeByID少了字母u,这也是导致报错的原因之一
最佳转换方式
方式1:纯Kotlin风格(推荐)
直接用Kotlin属性替代Java的私有字段+getter,代码更简洁,符合Kotlin语法习惯:
open class Language(ctx: Context, id: Int, val abbreviation: String, name: String) : DataBaseObject(ctx, id, name)
调用时直接访问属性即可:
val locale = Locale(dbc.getLanguageByID(SELECTED_LANGUAGE_ID).abbreviation)
注:修正了原调用代码中的两处拼写错误:
getLangaugeByID→getLanguageByID,getAbbrevation()→直接访问abbreviation属性
方式2:兼容Java风格getter(适配旧代码)
如果需要保留原Java的getAbbreviation()方法以兼容历史代码,可以显式定义:
open class Language(ctx: Context, id: Int, private val abbreviation: String, name: String) : DataBaseObject(ctx, id, name) { fun getAbbreviation(): String { return abbreviation } }
此时调用修正拼写后的getAbbreviation()方法即可正常运行:
val locale = Locale(dbc.getLanguageByID(SELECTED_LANGUAGE_ID).getAbbreviation())
额外优化点
自动转换的代码中出现的ctx!!和name!!可以去掉,因为父类构造参数ctx和name都是非空类型,子类传递非空参数更安全,避免空指针风险。
内容的提问来源于stack exchange,提问作者DevMD
相关产品推荐
相关产品推荐

