<:<和<:在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
我已经知道:
>< ;:是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,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)) ^ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |