继承特征集的类有很多。HashSet、TreeSet等
还有一个对象(我可以称它为特征集的伴生对象吗?不是在类集合的情况下?)集合和特征集合。
在我看来,只需在这个列表中再添加一个类"Set“,就可以很容易地理解它的结构。
有没有什么理由不应该存在Class Set?
发布于 2016-08-31 14:19:51
如果你只需要一个集合,使用Set.apply,你将拥有一个支持所有重要操作的有效集合。你不需要担心它是如何实现的。它准备好在大多数用例中很好地工作。
另一方面,如果某些操作的性能对您来说很重要,那么为set的具体实现创建一个具体的类,您就会确切地知道您拥有什么。
在java中,你可以这样写:
Set<String> strings = new HashSet<>(Arrays.asList("a", "b"));在scala中,您也可以使用这些类型
val strings: Set[String] = HashSet("a", "b")但是,如果不需要担心类型,也可以使用方便的工厂,只需使用
val strings = Set("a", "b")这没有什么错,我看不出添加另一个类会有什么帮助。有一个接口/特征和具体的实现是很正常的事情,中间不需要任何东西,也不会有什么帮助。
Set.apply是sets的工厂。您可以使用getClass检查结果对象的实际类。这个工厂为0-4的大小创建特殊的、优化的集合,例如
scala.collection.immutable.Set$EmptySet$
scala.collection.immutable.Set$Set1
scala.collection.immutable.Set$Set2对于更大的集合,它是一个哈希集,即scala.collection.immutable.HashSet$HashTrieSet。
发布于 2016-08-31 13:36:26
在Scala中,类和特征之间没有重叠。类是可以实例化的实现,而特征是可独立混合的接口。Set.apply的使用提供了一个具有接口集的对象,这就是使用它所需了解的全部内容。我完全理解想要一个具体的类型,但那是不必要的。正确的做法是将其保存到Set类型的val中,并只使用Set提供的接口。
我知道这可能不能令人满意,但是给它一点时间,Scala类型的系统本身就会有意义,即使这与Java所做的不同。
https://stackoverflow.com/questions/39239923
复制相似问题