1

鉴于我有一种使用密封特征和表示值的案例对象的枚举,是否可以强制执行一种机制来检索给定类型的单个唯一值,而不需要隐式参数?

隐含这将是

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 = ???
}

?

4

1 回答 1

1

看起来好像您正在尝试根据类型查找特定的值或行为,并且无论出于何种原因都不想将此行为放在某个常见的超类中。

看起来好像您正在尝试使用隐式对象和伴随对象来通过模拟 Java 静态的一些特征来实现这一点。这是您绝对希望从您的心理工具包中删除的模型,从面向对象编程的角度来看,它已被彻底破坏。

真正想要的是临时多态性,我们有更好的方法来做到这一点。有趣的是,它仍然使用隐式和上下文绑定:

sealed trait Enum
sealed trait Value1 extends Enum
sealed trait Value2 extends Enum

case object Value1 extends Value1
case object Value2 extends Value2

sealed abstract class UniqValue[T] { def value: T }
implicit object Value1HasUniq extends UniqValue[Value1] { val value = Value1 }
implicit object Value2HasUniq extends UniqValue[Value2] { val value = Value2 }

def test[V <: Enum : UniqValue]: V = implicitly[UniqValue[V]].value

你也可以定义test为:

def test[V <: Enum](implicit ev: UniqValue[V]): V = ev.value

这完全一样,手动删除编译器无论如何都会为你做的上下文边界的语法糖。

基本上,这一切都有效,因为编译在解析隐式时也会考虑类型参数。

如果您想了解更多关于这类事情的信息,搜索的神奇短语是“类型类”

于 2011-03-01T09:50:18.877 回答