2017-10-15 46 views
1

在Scala中,可以通过调用apply方法对某些类(或特征,显然)的伴随对象创建对象。例如:如何访问特性的默认类实现

List(1, 2, 3) 
res0: List[Int] = List(1, 2, 3) 

Set(1, 2, 3) 
res1: scala.collection.immutable.Set[Int] = Set(1, 2, 3) 

Map(1 -> "a", 2 -> "b") 
res2: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b) 

在那里,res0是类List的一个实例。

然而res1res2呢?没有具体的SetMap类,只是特征,并且特征不能被实例化。他们的班级是什么?

+1

同样适用于'List':它是一个抽象类,因此不能直接实例化。 –

回答

4

在这些情况下,SetMap分别只是res1res2的声明类型。为了获得实际的类型,试试这个:

Set(1, 2, 3).getClass.getCanonicalName 
Map(1 -> "a", 2 -> "b").getClass.getCanonicalName 

现在你会看到,他们不只是特质scala.collection.immutable.Setscala.collection.immutable.Map的实例;他们是实现这些特征的具体类的实例。

如果您想了解更多关于如何创建这些类的信息,可以查看SetMap的源代码。