【发布时间】:2015-08-17 12:06:37
【问题描述】:
我有简化的情况:
abstract sealed trait Top
class A[T] extends Top
class B[T] extends Top
class Typeclass[T]
implicit def a[T] = new Typeclass[A[T]]
implicit def b[T] = new Typeclass[B[T]]
现在我有一个 Map[String, Top] 并希望对映射中的所有值使用操作,这些值需要存在 Typeclass 的实例才能在上下文中可用。这将无法编译,因为映射中值的具体类型从其类型中不可见,因此我无法为它们设置上下文绑定。
有没有办法告诉编译器事实上总会有一个可用的实例?在这个例子中,这是因为有隐式函数为Top 的每个具体子类型生成这些实例。
或者是使用 HList 并递归其类型的唯一解决方案,要求所有实例都在上下文中?
【问题讨论】:
-
是否有理由不在 Top 上定义类型类实例(或作为补充?)无论如何,编译器不会因为知道实例可用而感到满意。它会想在编译时知道哪个实例。
-
@DidierDupont
Typeclass实例的实现取决于T的类型以及A或B的成员(在我的真实世界用例中)。我不知道如何在Top上实现它。 -
@DidierDupont 通过模式匹配,我可以区分
A和B,但据我所知,我无法从中获取类型T(不匹配每种可能的类型@ 987654334@). -
好的,去回答以获得更多空间。
标签: scala generics polymorphism implicit