2016-07-02 46 views
2

Scala的标准库中,我注意到了这一点:斯卡拉集合类可以扩展自己吗? AbstractSeq混乱

package scala 
package collection 
package mutable 

import generic._ 
... 

/** Explicit instantiation of the `Seq` trait to reduce class file size in subclasses. */ 
abstract class AbstractSeq[A] extends scala.collection.AbstractSeq[A] with Seq[A] 

AbstractSeq[A] extends AbstractSeq[A] with Seq[A]?

这到底是怎么回事?

回答

5

它扩展scala.collection.AbstractSeq,而定义是scala.collection.mutable.AbstractSeq,所以这些是不同的类。 (请注意不同的软件包名称:scala.collectionscala.collection.mutable。)

+0

有两个问题。正在写“包scala 包集合 包可变”与“包scala.collection.mutable”相同吗?其次,这是什么“减少课堂文件大小”seq的事情? –

+0

我只是猜测第二个问题,但通常'mutable.AbstractSeq'在大多数实现中也是'generic.Seq',尽管这些方法(实现了'Seq')在这个时候没有混合,那么也必须为其他实现类生成特征实现,所以如果你有5个具体类,那么你将有5倍的字节代码,而在这种情况下(因为虚拟调用)只有一次(和仍然能够覆盖它们)。 –

3

它们是不同的类。你正在看的那个是scala.collection.mutable.AbstractSeq,它正在扩展的是scala.collection.AbstractSeq

包是一种名称空间。不同的类可以具有相同的名称,只要它们位于不同的包中即可。

+0

两个问题。是否将“package scala package collection package mutable”写成“package scala.collection.mutable”?第二,这个“实例化...减少类文件大小”是什么? –

+1

是的,它是一样的。我不确定第二个问题。似乎与scala内部生成的类有关,这些类继承了多重特性。 – Dima