我是Scala的新手。我翻閱了幾本書,並閱讀了一些在線教程。我的第一個項目遇到了問題,所以我已經將代碼簡化爲可能出錯的最簡單的東西。scala中的構造函數,帶可變參數
我搜索谷歌和堆棧溢出爲斯卡拉/構造函數/可變參數,並閱讀了一些斯卡拉之旅。
的(幾乎)最簡單的代碼是:
class Foo(val params: Int*)
case class Foo1(val p: Int) extends Foo(p)
case class Foo2(val p1: Int, val p2: Int) extends Foo(p1, p2)
object Demo extends App {
override def main(args: Array[String]) {
val f = Foo2(1, 2)
f.p1
}
}
的異常發生存取時p1和是
異常在線程 「主要」 java.lang.ClassCastException:scala.collection.mutable.WrappedArray $ ofInt不能轉換爲java.lang.Integer中
使用eclipse訴諸調試,我發現一個有趣的特性:當變量尋找
f Foo2 (id=23)
p2 2
params WrappedArray$ofInt (id=33)
array (id=81)
[0] 1
[1] 2
那麼p1發生了什麼?
我讓您費心了一個新手的問題,對不起
Woot。我的第一個Scala bug。好,謝謝。我有一個解決辦法,但我很感激幫助。這讓我想起了Fortran等價塊或Pascal變體記錄。 – 2013-04-30 12:18:16
順便說一下,'class X(val p:Int *)'沒有多大意義。如果你想在構造X之後訪問'p',只需使用一個序列來代替可變參數:'class X(val p:Seq [Int])'或者class X(p:Int *){def params: Seq [Int] = p}'。 – sschaef 2013-04-30 12:22:47