Jestem nowicjuszem Scala. Przebiłem kilka książek i przeczytałem kilka samouczków online. Mój pierwszy projekt ma problemy, więc ograniczyłem kod do najprostszej rzeczy, która może pójść nie tak.Konstruktorzy w scala z varargs
Przeszukałem Google'a i przepełnienie stosu dla scala/constructors/varargs i przeczytałem kilka wycieczek po scala.
(Prawie) najprostszym kod jest:
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
}
}
Wyjątek występuje podczas dostępu p1 i
Wyjątek nici "głównym" java.lang.ClassCastException: scala.collection.mutable.WrappedArray $ ofInt nie mogą być oddane do java.lang.Integer
Odwołanie się do debugowania przy użyciu eclipse, znalazłem ciekawą właściwość: patrząc na zmienne
f Foo2 (id=23)
p2 2
params WrappedArray$ofInt (id=33)
array (id=81)
[0] 1
[1] 2
Co się stało z p1?
Przepraszam za kłopot Ci pytanie początkującego
Woot. Mój pierwszy błąd Scala. Ok dzięki. Mam pracę, ale doceniam pomoc. Przypomniało mi to bloki równoważności Fortran lub rekordy wariantu Pascala. –
Btw, "klasa X (val p: Int *)" nie ma większego sensu. Jeśli chcesz mieć dostęp do 'p' po konstrukcji X, po prostu użyj sekwencji zamiast varargs:' class X (val p: Seq [Int]) 'lub' class X (p: Int *) {def params: Seq [Int] = p} '. – sschaef