我想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
可以以某种方式表达此约束,以便获取错误编译时间吗?
您可以对条件使用广义类型约束,该约束永远不会成立,例如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]的证据参数的隐式值
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句