对 <:< 的"无"的隐式解析失败

  • 本文关键字:失败 scala implicit
  • 更新时间 :
  • 英文 :


以下代码无法在 Scala 2.12/2.13 上编译。为什么?

class X[U, T]
object X {
implicit def genericX[U, T](implicit ev: T <:< U): X[U, T] = new X[U, T]
}
implicitly[X[AnyRef, String]]  // compiles
implicitly[X[String, Nothing]] // does not compile

长话短说,编译器不喜欢在隐式中推断Nothing

为什么当其中一个类型参数应该是 Nothing 时,Scala 的隐式类不起作用?

尝试实现"荒谬"类型类时的隐式错误

https://www.reddit.com/r/scala/comments/73791p/nothings_twin_brother_the_better_one/

http://guillaume.martres.me/talks/typelevel-summit-oslo/?fbclid=IwAR1yDSz-MetOgBh0uWMeuBuuL6wlD79fN_4NrxAtl3c46JB0fYCYeeGgp1Y#/9(幻灯片10"对Nothing的恐惧"(

https://www.youtube.com/watch?v=YIQjfCKDR5A?t=459 (7:39(

https://www.youtube.com/watch?v=lMvOykNQ4zs

Nothing的恐惧

  • scalac急切地实例化,即使不安全

  • 通过从不推断Nothing来抵消

    class Foo[T] { def put(x: T) = {} }
    (new Foo).put("") // T? = String
    
  • 如果未Nothing下限,则失败

    class Foo[T >: Null] { def put(x: T) = {} }
    (new Foo).put("") // T? = Null
    // type mismatch: Null does not match String
    
  • 有时候你真的想推断Nothing

    class Foo[T]
    def foo[T](x: Foo[T]) = x
    foo(new Foo[Nothing]) // error
    

解决方法是引入类型Bottom

type Bottom <: Nothing
implicitly[Bottom =:= Nothing]
implicitly[Nothing =:= Bottom]
implicitly[X[AnyRef, String]]  // compiles
// implicitly[X[String, Nothing]] // does not compile
implicitly[X[String, Bottom]] // compiles

相关内容

  • 没有找到相关文章

最新更新