Sono un principiante alla Scala. Ho letto un paio di libri e ho letto alcuni tutorial online. Il mio primo progetto sta avendo problemi, quindi ho ridotto il codice alla cosa più semplice che può andare storta.Costruttori in scala con varargs
Ho cercato google e stack overflow per scala/constructors/varargs e ho letto un paio di tour di scala.
La (quasi) codice semplice è:
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
}
}
L'eccezione si verifica quando si accede p1 ed è
Exception in thread "main" java.lang.ClassCastException: scala.collection.mutable.WrappedArray $ ofInt non può essere lanciato a java.lang.Integer
Il ricorso al debugging con Eclipse, ho trovato un interessante proprietà: Se si guarda a variabili
f Foo2 (id=23)
p2 2
params WrappedArray$ofInt (id=33)
array (id=81)
[0] 1
[1] 2
Quindi cosa è successo a p1?
Mi dispiace per voi preoccupanti con una domanda newbie
Woot. Il mio primo bug alla Scala. Ok grazie. Ho un lavoro in giro, ma apprezzo l'aiuto. Questo mi ha ricordato i blocchi di equivalenza di Fortran, o i record delle varianti Pascal. –
Btw, 'classe X (val p: Int *)' non ha molto senso. Se vuoi avere accesso a 'p' dopo la costruzione di X usa solo una sequenza invece di varargs:' classe X (val p: Seq [Int]) 'o' classe X (p: Int *) {def params: Seq [Int] = p} '. – sschaef