强制 Scala Seq 仅使用单一类型(无 LUB)

Enforce Scala Seq to use a single type only (no LUB)

我想在 Scala 中创建和使用 Seq[T] 集合 并确保它只使用一种类型。所以如果我使用:

val l = List(1, 2, 2.0)

应该出现编译时错误 - List 元素都应该是 Double 或所有 Int.

考虑-Xlint:infer-any编译器flag

Warn when a type argument is inferred to be Any

结合致命警告至少可以防止推断出 Any 的最坏 LUB 情况

scala -Xlint:infer-any -Werror -e 'List(42, 3.14, "picard")'
warning: a type was inferred to be `Any`; this may indicate a programming error.
List(42, 3.14, "picard")
^
error: No warnings can be incurred under -Werror.

但是请注意,如果 LUB 比 Any 窄,这将无济于事,例如

scala -Xlint:infer-any -Werror -e 'Vector(List(1), Set(2))'

不发出警告。另一个可能有用的标志是 -Wnumeric-widen

Warn when numerics are widened.

例如

scala -Wnumeric-widen -Xlint:infer-any -Werror -e 'def f(i: Int, d: Double): List[Double] = List(i, d)'
warning: implicit numeric widening
def f(i: Int, d: Double): List[Double] = List(i, d)
                                              ^
error: No warnings can be incurred under -Werror.