gpt4 book ai didi

scala - 为什么String文字符合Scala Singleton

转载 作者:行者123 更新时间:2023-12-04 05:13:56 27 4
gpt4 key购买 nike

不管是否明智,我正在编写一种只接受Scala单例的方法,即通过“对象”实现的对象,而不是通过构造类或特征的实例来实现。它应该接受任何类型的Scala单例,因此“MySingleton.type”将不起作用。

我遇到了一个非常奇怪的构造“scala.Singleton”,该构造未在api文档中进行记录,但似乎可以解决问题:

scala> def check( obj : Singleton ) = obj
check: (obj: Singleton)Singleton

scala> check( Predef )
res0: Singleton = scala.Predef$@4d3e9963

scala> check ( new java.lang.Object() )
<console>:9: error: type mismatch;
found : java.lang.Object
required: Singleton
check ( new java.lang.Object() )

scala> check( Map )
res3: Singleton = scala.collection.immutable.Map$@6808aa2d

scala> check( Map.empty[Any,Any] )
<console>:9: error: type mismatch;
found : scala.collection.immutable.Map[Any,Any]
required: Singleton
check( Map.empty[Any,Any] )

但是,(对我而言)莫名其妙地是,字符串文字被视为单例,而显式构造的字符串则不被接受:
scala> check( "foo" )
res7: Singleton = foo

scala> check( new String("foo") )
<console>:9: error: type mismatch;
found : java.lang.String
required: Singleton
check( new String("foo") )

为什么String文字符合Singleton?我是否误解了Singleton类型应该指定什么?

最佳答案

首先,什么是单例类型?如果您认为类型是一组值,那么单例类型就是一个只有一个元素的集合。

最常见的是,顶级对象可以居住在这样的集合中。

scala> object X
defined module X

scala> X: X.type
res41: X.type = X$@131d1cb

scala> res41: Singleton
res42: Singleton = X$@131d1cb

更一般地,稳定值可以形成单例类型。
scala> object X { val y: String = "boo" }
defined module X

scala> X.y: X.y.type
res44: X.y.type = boo

scala> res44: Singleton
res45: Singleton = boo

如果 ydefvar,则它不再符合条件,因为该值随时间推移可能不相同,因此编译器无法保证单例类型对一个值进行分类。
scala> object X { def y: String = "boo" }
defined module X

scala> X.y: X.y.type
<console>:12: error: stable identifier required, but X.y found.
X.y: X.y.type
^

scala> object X { var y: String = "boo" }
defined module X

scala> X.y: X.y.type
<console>:12: error: stable identifier required, but X.y found.
X.y: X.y.type
^

还有一个限制: AnyVal不能形成单例类型,因为语言规范专门将它们限制为 AnyRef

保罗·菲利普斯(Paul Phillips)一直在策划 branch,它允许您表达文字的单例类型。
val xs: Stream[0.type](0)
val ys: Stream[0.type](0, 1) // does not compile
val x = xs.head // inferred type is 0.type, we statically know that this can only be 0!

关于scala - 为什么String文字符合Scala Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11594828/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com