Scala 如何访问traits的默认类实现
在Scala中,可以通过对某些类(或特征)的伴生对象调用Scala 如何访问traits的默认类实现,scala,Scala,在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
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
是类的一个实例
但是
res1
和res2
呢?没有具体的Set
或Map
类,只有trait,trait不能实例化。它们的类别是什么?在这些情况下,Set
和Map
分别是res1
和res2
的声明类型。要获取实际类型,请尝试以下操作:
现在您将看到它们不仅仅是traitsscala.collection.immutable.Set
和scala.collection.immutable.Map
的实例;它们是实现这些特性的具体类的实例
如果您想进一步了解这些类是如何创建的,可以查看和的源代码。在这些情况下,
Set
和Map
分别是res1
和res2
的声明类型。要获取实际类型,请尝试以下操作:
现在您将看到它们不仅仅是traitsscala.collection.immutable.Set
和scala.collection.immutable.Map
的实例;它们是实现这些特性的具体类的实例
如果您想了解这些类是如何创建的,您可以查看和的源代码。同样适用于
List
:它是一个抽象类,因此不能直接实例化。同样适用于List
:它是一个抽象类,因此不能直接实例化。
Set(1, 2, 3).getClass.getCanonicalName
Map(1 -> "a", 2 -> "b").getClass.getCanonicalName