gpt4 book ai didi

scala - < :< and <: in scala 之间有什么不同

转载 作者:行者123 更新时间:2023-12-03 15:20:27 26 4
gpt4 key购买 nike

我已经知道:

  • <:是 Scala 语法类型约束
  • <:<是利用 Scala 隐式达到类型约束的类型

  • 例如:
    object Test {
    // the function foo and bar can have the same effect

    def foo[A](i:A)(implicit ev : A <:< java.io.Serializable) = i
    foo(1) // compile error
    foo("hi")

    def bar[A <: java.io.Serializable](i:A) = i
    bar(1) // compile error
    bar("hi")
    }

    但我想知道我们什么时候需要使用 <:<:< ?

    如果我们已经有了 <: ,为什么我们需要 <:< ?

    谢谢!

    最佳答案

    两者之间的主要区别在于 <:是对类型的约束,而 <:<是一种类型,当用作隐式参数时,编译器必须为其找到证据。这对我们的程序意味着,在 <:在这种情况下,类型推断器将尝试找到满足此约束的类型。例如。

    def foo[A, B <: A](a: A, b: B) = (a,b)

    scala> foo(1, List(1,2,3))
    res1: (Any, List[Int]) = (1,List(1, 2, 3))

    在这里,推理器发现 IntList[Int]有普通超型 Any ,因此它推断出 A满足 B <: A .
    <:<更具限制性,因为类型推断器在隐式解析之前运行。所以当编译器试图找到证据时,类型已经固定了。例如。
    def bar[A,B](a: A, b: B)(implicit ev: B <:< A) = (a,b)

    scala> bar(1,1)
    res2: (Int, Int) = (1,1)

    scala> bar(1,List(1,2,3))
    <console>:9: error: Cannot prove that List[Int] <:< Int.
    bar(1,List(1,2,3))
    ^

    关于scala - < :< and <: in scala 之间有什么不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19829770/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com