sin*_*spd 7 scala type-inference dotty union-types scala-3
让我们从以下内容开始
val x = List(1, 2, "a")
Run Code Online (Sandbox Code Playgroud)
这个异构列表被推断为List[Any]就像在 Scala 2 中一样
然而以下
val x2 = List(List(1, 2), Vector("a", "b"))
Run Code Online (Sandbox Code Playgroud)
推断为 List[scala.collection.immutable.AbstractSeq[Int | String]]
这是相当混乱的行为。为什么Any在一种情况下会推断出两种不相交类型的 LUB ,而在另一种情况下会推断出联合类型?
如果这只是一个设计决定,是否有任何此类情况需要人们注意?
更聪明的国家
我们避免推断联合类型的原因与我们避免推断单例类型的原因相同,因为有时它们“过于精确”
我对这句话的解释是,键入List(1,2)asList[Int]而不是List[1 | 2]或List(new Cat, new Dog)asList[Animal]代替更有意义List[Cat | Dog]。
另请参阅相关问题(我的)中Dmytro 的评论
引自guillaume.martres.me/talks/dotty-tutorial/ #/ 1/13(幻灯片 15“类型推断和联合类型”):“默认情况下,Dotty 不推断联合类型,它们由非联合近似超类型。联合类型可能“过于精确”并阻止合法代码编译”
另请参阅23:38中提到的“Dotty and types: the story so far”。
然而,根据smarter,联合的扩大仅执行一次以避免无限 LUB :
当我们进行一次扩大时,结果类型可能在某处有一个联合(如文档中联合类型的加入部分中的示例),我们不会扩大,如果我们递归地进行扩大,我们可以获得确实无限润滑
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |