如何从TypeClass解析中排除特定类型?

问题描述 投票:2回答:2

我想为大多数类型提供ToCondition操作,但不为字符串提供。 (这是在移植Javascript代码时,非空和非零测试经常执行,并且重写所有此类测试以进行适当的比较繁琐)。这样做很容易,因此我收到一个错误运行时:

trait ToCondition[T] {
  def apply(x: T): Boolean
}
implicit object ToConditionInt extends ToCondition[Int] {
  override def apply(x: Int) = x != 0
}
implicit object ToConditionString extends ToCondition[String] {
  override def apply(x: String) = throw new UnsupportedOperationException("Cannot use String as a condition")
}
implicit object ToConditionAnyRef extends ToCondition[AnyRef] {
  override def apply(x: AnyRef) = x != null
}

def toCondition[T: ToCondition](a: T): Boolean = implicitly[ToCondition[T]].apply(a)

toCondition(1) // true

toCondition(null:AnyRef) // false

toCondition("") // throws runtime

可以以某种方式表达此约束,以便获得错误编译时间吗?

scala typeclass type-constraints
2个回答
3
投票

您可以将通用类型约束与条件一起使用,该条件永远不会为真,例如String =:= Nothing

implicit def ToConditionString(implicit ev: String =:= Nothing) = new ToCondition[String] {
  override def apply(x: String) = throw new UnsupportedOperationException("Cannot use String as a condition")
}

然后

toCondition("")

在编译时失败:

找不到类型为ToCondition [String]的证据参数的隐式值>


2
投票

如果允许使用无定形,则使用类型不等式=:!=。这是String的版本提高编译错误:

© www.soinside.com 2019 - 2024. All rights reserved.