Я пытаюсь написать универсальный c модуль хранилища, который может обрабатывать различное количество ключей
trait Repo[K, V] {
def read(key: K): V
}
trait DynamoDBRepo extends Repo[K,V]{
def aRepo[K:StringIdentifiable,V]() = new Repo[K,V]{
val dynamoDBClient = ???
override def read(key: K, tableName: String): V = {
val tableKey: String = implicitly[StringIdentifiable].identify(key)
dynamoDBClient.Table(tableName).get(tableKey) //(*)
}
}
}
@typeclass trait StringIdentifiable[M] {
def identify(id: M): String
}
(*) Однако, dynamoDBClient.Table(tableName).get(key)
может также взять кортеж в качестве ключа (ключ раздела и ключ сортировки).
Поэтому я хочу каким-то образом извлечь String из K или (String, String) из (K, K) из ключа: K override def read(key: K)
Сначала я попытался this для извлечения типов из кортежа, который реализует класс типов StringIdentifiable. Я застрял.
Затем попытался переписать класс типа StringIdentifiable, который возвращал бы String, когда аргумент был одним ключом, но (String, String), когда аргумент для чтения был кортежем , Но я не смог использовать этот метод либо .
Как я могу решить его проблему, не потеряв при этом свою абстракцию