我知道当你输入:
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,然后适当地设置元素.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。