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

Posted

技术标签:

【中文标题】TypeConverter() 在 Android 中的 Room 出现 TypeConverter 错误时具有私有访问权限【英文标题】:TypeConverter() has private access in TypeConverter error with Room in Android 【发布时间】:2018-12-28 13:15:30 【问题描述】:

我已经在我的项目中集成了 Room。在这个项目中,一些类在 Kotlin 中,一些在 Java 中。在我使用 android Studio Ctrl+Alt+Shift+K 组合将我的 Java 文件转换为 Kotlin 后,我已经开始面临这个错误:

TypeConverter() 在 TypeConverter 中具有私有访问权限

在生成的java类中,在这一行:

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

但是PointOfInterest 类中的TypeConverter 是公开的。

【问题讨论】:

你能用TypeConverter添加你的PointOfInterest类吗? 【参考方案1】:

不要将object 关键字更改为class(正如公认的答案所暗示的那样)。 object declaration 保证单例模式。

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

看看官方的Android Architecture Components samples,特别是GithubTypeConverters.kt。此外,this discussion 也很有用。这是我的DateTypeConverter.kt

object DateTypeConverter 

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

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


【讨论】:

@JvmStatic 是必不可少的部分(这是有道理的)。谢谢【参考方案2】:

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

关于转换为 Kotlin 的另一点: 在 Parcelable 类的情况下,android studio 中的 kotlin 转换文件不会在 CREATOR 字段上添加 @JvmField。因此,您必须手动添加 @JvmField val CREATOR 以确保 Parcelable 类正常工作。

【讨论】:

以上是关于TypeConverter() 在 Android 中的 Room 出现 TypeConverter 错误时具有私有访问权限的主要内容,如果未能解决你的问题,请参考以下文章

[UWP]了解TypeConverter

GregorianCalendar 字段未通过 TypeConverter 转换为 Date

TypeConverter 实现的索引越界错误

自定义类型转换器之TypeConverter

WPF属性与特性的映射(TypeConverter)

在 VS10 .NET 表单中寻找更动态的设计器 TypeConverter 序列化