以 case 对象为键的 HMap
HMap with case objects as keys
我正在尝试使用 Shapeless 的 HMap 实现一些目标,但我不确定这是否可行,如果可行,我将如何实现。
我想使用 HMap 作为用户偏好的映射,其中的值可以是不同的类型。这就是我的意思:
object UserPreferences {
sealed abstract class BooleanPreference
case object IsStudent extends BooleanPreference
case object SubscribedToNotifications extends BooleanPreference
sealed abstract class StringPreference
case object Language extends StringPreference
class UserPreference[K, V]
implicit val booleanPreferenceToBoolean = new UserPreference[BooleanPreference, Boolean]
implicit val stringPreferenceToString = new PartialClientPref[StringPreferenceKey, String]
}
然后我将这张地图作为方法参数:
import UserPreferences._
def someMethod(userPreferences: HMap[UserPreference]) {
val userLanguage = userPreferences(Language)
}
最后一个代码片段无法编译。首先它抱怨缺少隐式参数,但是当我显式添加 stringPreferenceToString
时,编译器指示它需要 UserPreference[UserPreferences.Language.type, NotInferredV]
但发现 UserPreference[StringPreference, String]
您需要将 Language
扩展为 StringPreference
和 import userPreferences._
。
import UserPreferences._
def someMethod(userPreferences: HMap[UserPreference]) {
import userPreferences._
val userLanguage = userPreferences(Language: StringPreference)
}
我正在尝试使用 Shapeless 的 HMap 实现一些目标,但我不确定这是否可行,如果可行,我将如何实现。
我想使用 HMap 作为用户偏好的映射,其中的值可以是不同的类型。这就是我的意思:
object UserPreferences {
sealed abstract class BooleanPreference
case object IsStudent extends BooleanPreference
case object SubscribedToNotifications extends BooleanPreference
sealed abstract class StringPreference
case object Language extends StringPreference
class UserPreference[K, V]
implicit val booleanPreferenceToBoolean = new UserPreference[BooleanPreference, Boolean]
implicit val stringPreferenceToString = new PartialClientPref[StringPreferenceKey, String]
}
然后我将这张地图作为方法参数:
import UserPreferences._
def someMethod(userPreferences: HMap[UserPreference]) {
val userLanguage = userPreferences(Language)
}
最后一个代码片段无法编译。首先它抱怨缺少隐式参数,但是当我显式添加 stringPreferenceToString
时,编译器指示它需要 UserPreference[UserPreferences.Language.type, NotInferredV]
但发现 UserPreference[StringPreference, String]
您需要将 Language
扩展为 StringPreference
和 import userPreferences._
。
import UserPreferences._
def someMethod(userPreferences: HMap[UserPreference]) {
import userPreferences._
val userLanguage = userPreferences(Language: StringPreference)
}