加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

<:<和<:在scala中有什么不同?

发布时间:2020-12-16 09:30:25 所属栏目:安全 来源:网络整理
导读:我已经知道: lt ;:是Scala语法类型约束 而:是利用Scala隐含来达到类型constrait的类型 例如: 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 erro
我已经知道:

>&lt ;:是Scala语法类型约束
而<:<是利用Scala隐含来达到类型constrait的类型
例如:

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")
}

但是我想知道什么时候我们需要使用&lt ;:和<:< ? 如果我们已经有<:,为什么我们需要<:< ? 谢谢!

解决方法

两者之间的主要区别是<:是类型的约束,而<:<当用作隐式参数时,编译器必须找到证据的类型。对于我们的程序意味着什么,在&lt ;:的情况下,类型参与者将尝试找到一个满足该约束的类型。例如。

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

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

在这里,推理者发现Int和List [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,3))
<console>:9: error: Cannot prove that List[Int] <:< Int.
              bar(1,3))
                 ^

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读