Kotlin lambda 和类型推断
Kotlin lambdas and type inference
我在 Kotlin 中实现了以下枚举
enum class PlaylistAction(val playlistFilter:(Playlist) -> Boolean) {
PLAY ({ it.playListOwner.Id == "xxx" }),
SAVE({true})
}
我想用它来过滤这样的列表:
var test = playlists.filter { playlistActionType.playlistFilter}
其中 playlistActionType 是 PlaylistAction
类型,播放列表是 List<Playlist>
但是我收到以下错误:
Error:(122, 34) Type mismatch: inferred type is (Playlist) -> (Playlist) -> Boolean but (Playlist) -> Boolean was expected
为什么推断类型是 (Playlist) -> (Playlist) -> Boolean 而不是 (Playlist) -> Boolean?
var test = playlists.filter(playlistActionType.playlistFilter)
会起作用。您将一个函数传递给 filter
,不需要额外的 lambda。
通过将谓词放在 {}
中,您实际上是在创建另一个 lambda,结果是 returns 您的谓词,这就是为什么您最终得到:(Playlist) -> (Playlist) -> Boolean
而不是 (Playlist) -> Boolean
.
使用普通括号应该可以解决问题:
var test = playlists.filter(playlistActionType.playlistFilter)
我在 Kotlin 中实现了以下枚举
enum class PlaylistAction(val playlistFilter:(Playlist) -> Boolean) {
PLAY ({ it.playListOwner.Id == "xxx" }),
SAVE({true})
}
我想用它来过滤这样的列表:
var test = playlists.filter { playlistActionType.playlistFilter}
其中 playlistActionType 是 PlaylistAction
类型,播放列表是 List<Playlist>
但是我收到以下错误:
Error:(122, 34) Type mismatch: inferred type is (Playlist) -> (Playlist) -> Boolean but (Playlist) -> Boolean was expected
为什么推断类型是 (Playlist) -> (Playlist) -> Boolean 而不是 (Playlist) -> Boolean?
var test = playlists.filter(playlistActionType.playlistFilter)
会起作用。您将一个函数传递给 filter
,不需要额外的 lambda。
通过将谓词放在 {}
中,您实际上是在创建另一个 lambda,结果是 returns 您的谓词,这就是为什么您最终得到:(Playlist) -> (Playlist) -> Boolean
而不是 (Playlist) -> Boolean
.
使用普通括号应该可以解决问题:
var test = playlists.filter(playlistActionType.playlistFilter)