为什么不能将字符串文字分配给 String 类型的变量

Why can't a string literal be assigned to variable of type String

我正在试用 Scala 3,并尝试将字符串文字分配给控制台中的变量。如果我不给它明确的类型,一切都很好:

scala> val s = "hello"
val s: String = hello

并且变量甚至具有推断出的类型 String。但是,当我将类型设为显式时,出现类型错误:

scala> val t: String = "hello"
1 |val t: String = "hello"
  |                ^^^^^^^
  |                Found:    ("hello" : String)
  |                Required: String

当我使用显式类型 var 时也会发生同样的情况:

scala> var v: String = _
var v: String = null

scala> v = "hello"
1 |v = "hello"
  |    ^^^^^^^
  |    Found:    ("hello" : String)
  |    Required: String

但是,如果我用字符串文字初始化 var,我可以为它分配其他字符串文字:

scala> var u = "hello"
var u: String = hello

scala> u = "world"
u: String = world

某些字符串变量被允许保存字符串文字而另一些则不允许,背后的类型系统秘密是什么?

我想通了:我在我的包中定义了一个名为 String 的案例 class,它掩盖了 java.lang.String。但是错误消息没有包括 FQCN,导致混淆。