【发布时间】:2021-08-09 19:25:54
【问题描述】:
我关注这篇文章到create union types。这些文章几乎没有关于 Primitive 类型的答案,但我的场景是它的扩展。
所以,我正在尝试定义一个采用 Map[String, A] 的方法,其中 A 是允许的类型集。
这是我的联合类型类:
sealed trait SupportedType[A]
object SupportedType {
implicit val byteBufferColumn : SupportedType[ByteBuffer] = new SupportedType[ByteBuffer] {}
implicit val longColumn : SupportedType[java.lang.Long] = new SupportedType[java.lang.Long] {}
implicit val byteArrayColumn : SupportedType[Array[Byte]] = new SupportedType[Array[Byte]] {}
implicit val stringColumn : SupportedType[String] = new SupportedType[String] {}
}
这是我定义的方法:
def upsert[A: SupportedType](key: T, values: Map[String, A], timestamp: Long, ttl: Duration): Future[Unit]
这就是我调用方法的方式:
dataStore.upsert(
cacheKey,
Map(
itColumn -> ByteBuffer.wrap(Utils.compress(iti.toByteArray)),
cacheWriteTimeColumn -> writeTime.toEpochMilli
),
writeTime.toEpochMilli,
ttl
)
错误:No implicit arguments of type: SupportedType[Any]
我的猜测是 writeTime.toEpochMilli 返回 java.long 类型,正如您在 SupportedType 中看到的,我尝试定义 java.lang.Long 但那不起作用。
任何帮助将不胜感激。
【问题讨论】:
-
Map 并不知道其中的所有元素都有一个正确的 typeclass 实例。您的选择是,使用 magnet 模式,或者将每个值与另一个类中的 typeclass 实例一起压缩。
-
你能举个例子吗?
-
请问,稍后您将如何处理 Map 中的这些值?也许你想要做的就是调用像
serialize这样的单个方法,它将值转换为字节缓冲区或类似的东西? -
这张地图包含将存储在数据库中的列名、列值,是的,我想到了与您所说的相同的事情,但是使用团队中当前的设计方法,我存储了每个分别列
-
this 之类的内容是否适用于您的用例?如果是这样,请告诉我将其发布为答案。
标签: scala generics type-conversion