强制 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.
我想在 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.