【发布时间】:2011-07-06 05:17:13
【问题描述】:
鉴于我有一种使用密封特征和表示值的案例对象的枚举,是否可以强制执行一种机制来检索给定类型的单个唯一值,而不需要隐式参数?
隐含这将是
sealed trait Enum
sealed trait Value1 extends Enum
case object Value1 extends Value1 { implicit val me: Value1 = Value1 }
sealed trait Value2 extends Enum
case object Value2 extends Value2 { implicit val me: Value1 = Value1 }
def test[V <: Enum](implicit evidence: V): V = evidence
test[Value1]
是否可以删除隐式参数进行测试?也就是说,要确保 V 是 Enum 的已定义子类型(显然, test[Enum] 应该失败)。死结是:
object Enum {
def unique[V <: Enum]: V = ???
}
?
【问题讨论】:
-
我不知道你想用这个诡计来达到什么目的。为什么不能只使用 Java 类型安全枚举?
-
@yhwong:我希望能够创建一个方法,例如 def
fill[R <: Rate](n: Int)(fun: => GE[R]) : Mix[R]wheretrait GE[R <: Rate] { def rate: R }和trait Mix[R <: Rate] extends GE[R]这样我就可以用n == 0调用fill并且仍然可以能够构造Mix,尽管无法从对fun的任何调用中检索R的值。当涉及另一个间接时,添加R的隐式值会导致类型推断出现一些问题,例如def disjoint[R <: Rate, G <: GE[R]](n: Int)(fun: => G): G -
@yhwong:另一种解释“为什么”:理想情况下,我不需要
GE为R提供值,这可以留给GE的具体实例。但是,我需要能够在GE上调用二元运算符,它构造一个目标GE,其类型参数R取决于操作数的类型参数,例如(a: GE[audio]) * (b: GE[control])产生HigherRate[audio, control]。虽然这一切都可以在不传递R的值的情况下完成,但我希望能够允许轻松的动态输入,这样我就可以做到someGE.rate match { ... }
标签: scala types enumeration implicit-conversion sealed