使用Parse.com后台保存对象时,无法重写done()函数报错咨询
解决Kotlin中Parse
saveInBackground 回调的 override 错误 这个报错是因为你把Java里匿名内部类的写法直接套到Kotlin里啦!在Kotlin中,你不需要(也不能)给局部函数加override修饰符,得用Kotlin特有的方式实现回调接口。
方法1:用对象表达式(和Java匿名类写法最接近)
对应你Java里的写法,Kotlin里可以用对象表达式来实现SaveCallback接口,这样就能正确重写done方法:
myObject.saveInBackground(object : SaveCallback { override fun done(e: ParseException?) { if (e == null) { myObjectSavedSuccessfully() } else { myObjectSaveDidNotSucceed() } } })
这里的object : SaveCallback就相当于Java里的new SaveCallback(),然后在这个对象内部重写done方法,这时候override是合法的,因为它是接口方法的重写。
方法2:用Lambda简化(更简洁的Kotlin写法)
因为SaveCallback是只有一个抽象方法的函数式接口,Kotlin支持直接用Lambda表达式来简化代码,不用显式写override:
myObject.saveInBackground { e -> if (e == null) { myObjectSavedSuccessfully() } else { myObjectSaveDidNotSucceed() } }
这种写法更符合Kotlin的风格,编译器会自动把Lambda转换成SaveCallback的实现。
整合到你的StarterApplication类里的示例
如果是在onCreate里调用的话,完整代码大概是这样:
class StarterApplication : Application() { override fun onCreate() { super.onCreate() // 初始化Parse(记得替换成你的配置) Parse.initialize(Parse.Configuration.Builder(this) .applicationId("YOUR_APP_ID") .server("YOUR_SERVER_URL") .build()) // 示例:创建并保存Parse对象 val myObject = ParseObject("TestObject") myObject.put("foo", "bar") // 用Lambda方式的回调 myObject.saveInBackground { e -> if (e == null) { myObjectSavedSuccessfully() } else { myObjectSaveDidNotSucceed() } } } private fun myObjectSavedSuccessfully() { // 保存成功后的逻辑 } private fun myObjectSaveDidNotSucceed() { // 保存失败后的逻辑 } }
总结一下:你之前错误地把override fun done()当成了局部函数来写,而正确的做法是通过对象表达式或者Lambda来实现回调接口,这样override(如果用对象表达式的话)就会被识别为接口方法的重写,不会再报错啦!
内容的提问来源于stack exchange,提问作者Jurgiele
相关产品推荐
相关产品推荐

