以 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 扩展为 StringPreferenceimport userPreferences._

import UserPreferences._

def someMethod(userPreferences: HMap[UserPreference]) {
  import userPreferences._
  val userLanguage = userPreferences(Language: StringPreference)
}