9 scala
我想为以下类型创建一个存储:
List(List(2.3,1.1),List(2.2, 1))
Run Code Online (Sandbox Code Playgroud)
但如果我做以下事情:
var y = List(List (1.0, 2.2), List(2, 1.1, -2.1))
Run Code Online (Sandbox Code Playgroud)
然后它创建List [AnyVal]并在我尝试执行数学运算时给出错误:
y(0)(0) * 2 // Error - value '2' is not a member of AnyVal
Run Code Online (Sandbox Code Playgroud)
在两个示例中,一个列表包含一个作为Int的数字(第一个案例中的最后一个,第二个列表中的第一个元素),其余的数字是双打.因此列表元素的推断类型将是AnyVal,这是它们的第一个常见超类型,因此您的外部列表将成为List [List [AnyVal]].
如果你也尝试使用scala 2.8,那么它应该使用Numeric而不是AnyVal,因为它成为Double和Int的超类型.大多数数值运算(在你的情况下乘法)也适用于它们.
要修复2.7.x的问题,只需使用双打来获取这些值(1.0或1D).
明确地将类型声明为List [List [Double]]可能也会有所帮助.在这种情况下,您给出的Int值将转换为Doubles.
您可能会发现此链接有用:http : //debasishg.blogspot.com/2009/01/higher-order-abstractions-in-scala-with.html
在上面的链接中,有一个列出列表的示例:
val brs: List[List[String]] =
List(List("dave", "john", "sam"), List("peter", "robin", "david"), List("pras", "srim"))
Run Code Online (Sandbox Code Playgroud)
因此,对于您的问题,您可能需要:
var y : List[List[Float]] = ...
Run Code Online (Sandbox Code Playgroud)
这样,您就可以消除类型推断的任何问题。