Scala 3中能否实现可靠的Not[A]类型?
能否在Scala 3中实现可靠的Not[A]类型?
多年前曾有人讨论过类似问题,遗憾的是基于“not given A <:< B”的方案在涉及抽象类型时会失效——这犯了“缺乏证据不等于证据不存在”的逻辑谬误。
从技术角度来说,借助宏可以验证表达式类型,若类型信息不全则抛出错误,但我想要的方案不止能处理“not A <:< B”的情况,还需要仅在A with B实际等价于Nothing时生效:也就是其中一个类型为sealed/final,且两个类型无法混合。此外,这种场景下无需知晓两个类型的完整信息:比如若A是final类型,那么只要B的上界不是类型变量或A即可。
动机示例
sealed trait Marker sealed trait A[X] final class Special[X <: Marker] extends A[X] final class Generic[X :Not[Marker]#Proof] extends A[X]
在上述示例中,若有a: A[Marker],则可以确定a.asInstanceOf[Special[Marker]]是安全的。
内容的提问来源于stack exchange,提问作者Turin
相关产品推荐
相关产品推荐

