注释不能用作 annotations 参数

And*_*ilo 9 android kotlin android-room

我得到一个错误,尽管按照文档说的完全一样。文件

data class PlaylistWithSongs(
    @Embedded val playlist: Playlist,
    @Relation(
         parentColumn = "playlistId",
         entityColumn = "songId",
         associateBy = @Junction(PlaylistSongCrossRef::class)
    )
    val songs: List<Song>
)
Run Code Online (Sandbox Code Playgroud)

我的问题:

错误

data class FileEntryWithTags(
        @Embedded val fileEntry: FileEntry,
        @Relation(
                parentColumn = FileEntry.COLUMN_UUID,
                entityColumn = Tag.COLUMN_ID,
                associateBy = @Junction(FileEntryTagCrossRef::class)
        )
        val tags: List<Tag>
)
Run Code Online (Sandbox Code Playgroud)

Sla*_*law 15

看起来 Android 文档中有一个错误。Kotlin 参考资料中的Annotations - Kotlin Programming Language页面告诉我们:

如果一个注解被用作另一个注解的参数,它的名称不以@字符为前缀:

annotation class ReplaceWith(val expression: String)

annotation class Deprecated(
        val message: String,
        val replaceWith: ReplaceWith = ReplaceWith(""))

@Deprecated("This function is deprecated, use === instead", ReplaceWith("this === other"))
Run Code Online (Sandbox Code Playgroud)

所以你的代码应该是:

data class FileEntryWithTags(
        @Embedded val fileEntry: FileEntry,
        @Relation(
                parentColumn = FileEntry.COLUMN_UUID,
                entityColumn = Tag.COLUMN_ID,
                associateBy =  Junction(FileEntryTagCrossRef::class)
        )
        val tags: List<Tag>
)
Run Code Online (Sandbox Code Playgroud)

  • 你是对的。Android Room 文档中存在错误。没有“@”一切工作正常。 (2认同)