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

Scala中List(),Array()和新List(),新Array()之间的差异

发布时间:2020-12-16 10:08:29 所属栏目:安全 来源:网络整理
导读:我知道当你输入: val list = List(2,3) 您正在访问List对象的apply方法,该方法返回List.我无法理解的是,当List类是抽象的并且因此不能直接实例化时,为什么这是可能的(新的List()不会编译)? 我还想问一下有什么区别: val arr = Array(4,5,6) 和 val arr =
我知道当你输入:

val list = List(2,3)

您正在访问List对象的apply方法,该方法返回List.我无法理解的是,当List类是抽象的并且因此不能直接实例化时,为什么这是可能的(新的List()不会编译)?
我还想问一下有什么区别:

val arr = Array(4,5,6)

val arr = new Array(4,6)

解决方法

我开始写这个,确定这个的简单方法是查看你正在调用的方法的源代码,这些方法可以从 ScalaDoc获得.但是,实际构建列表所经历的各种间接层次都是骗局的. “容易”这个词!如果需要,值得查看,从List对象中的apply方法开始,定义如下:

override def apply[A](xs: A*): List[A] = xs.toList

您可能知道也可能不知道xs:A *形式的参数在内部被视为Seq,这意味着我们在Seq上调用toList方法,Seq在TraversableOnce中定义.然后,它委托给一个泛型的方法,该方法寻找一个隐式的方法
CanBuildFrom实际构建列表.所以你得到的是由CanBuildFrom选择的List的一些实现.你实际得到的是一个scala.collection.immutable.$冒号$冒号,它实现了一个单链表.

幸运的是,Array.apply的行为更容易查找:

def apply[T: ClassTag](xs: T*): Array[T] = {
    val array = new Array[T](xs.length)
    var i = 0
    for (x <- xs.iterator) { array(i) = x; i += 1 }
    array
  }

因此,Array.apply只是委托给新??的Array,然后适当地设置元素.

(编辑:李大同)

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

    推荐文章
      热点阅读