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

时间:2016-11-18 13:03:38

标签: scala collections compile-time typechecking

我想在Scala中创建并使用Seq [T]集合 并确保它只使用一种类型。所以,如果我使用: val l = Lisr(1, 2, 2.0) 应该发生编译时错误 - 列表应该全部 双打或全部。

TIA

1 个答案:

答案 0 :(得分:0)

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

警告将类型实参推断为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

扩大数字时发出警告。

例如

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.