TypeConverter() 在 Android 中的 TypeConverter 错误中具有私有访问权限

TypeConverter() has private access in TypeConverter error with Room in Android

我已经在我的项目中集成了 Room。在这个项目中,一些 classes 在 Kotlin 中,一些在 Java 中。在我使用 Android Studio Ctrl+Alt+Shift[ 将 Java 文件转换为 Kotlin 后=27=]+K组合,我开始遇到这个错误:

TypeConverter() has private access in TypeConverter

在生成的javaclass中,在这一行:

private final PointOfInterest.TypeConverter __typeConverter_5 = new PointOfInterest.TypeConverter();

但是 PointOfInterest class 中的 TypeConverter 是 public。

在我的特殊情况下,我使用 android studio ctrl+alt+shift+k 组合键将我的 Java 文件转换为 Kotlin。 android studio 所做的是,它将我的 class TypeConverter classes 转换为 object TypeConverter 的类型,我只是想不通为什么我的代码停止工作。因此,我手动将 object TypeConverter 更改为 class TypeConverter

关于转换为 Kotlin 的更多要点: 在 Parcelable class 的情况下,android studio 中的 kotlin 转换文件不会添加 @JvmField创建者字段。因此,您必须手动添加它 @JvmField val CREATOR 以确保 Parcelable classes.

正常工作

Don't change the object keyword to class (as the accepted answer suggests). The object declaration guarantees the Singleton pattern.

TypeConverter java 文件自动转换为 kotlin 文件后,您应该用 @JvmStatic 标记所有内部转换器函数,以便 Room 可以将它们用作常规静态函数。

看看官方Android Architecture Components samples, specifically the GithubTypeConverters.kt. Also, this discussion会有用的。这是我的 DateTypeConverter.kt:

object DateTypeConverter {

    @TypeConverter
    @JvmStatic
    fun toDate(timestamp: Long?) = timestamp?.let { Date(timestamp) }

    @TypeConverter
    @JvmStatic
    fun toTimestamp(date: Date?) = date?.time

}