Non ho davvero questo piccolo coso. Ho una classe astratta Box con diverse sottoclassi per diversi tipi. Per esempioCome utilizzare l'estrattore in polimorfico non valido?
abstract class Box
class StringBox(val sValue : String) extends Box
Il metodo apply nell'oggetto compagno per Box è semplice:
object Box{
def apply(s: String) = new StringBox(s)
def apply(b: Boolean) = new BooleanBox(b)
def apply(d: Double) = new DoubleBox(d)
}
così posso scrivere
val sb = Box("StringBox)
Va bene, la scrittura unapply fa qualche problema. La mia prima idea era di usare il pattern matching del tipo, in questo modo questo:
def unapply(b: Box) = b match {
case sb: StringBox => Some(sb.sValue)
case bb: BooleanBox => Some(bb.bValue)
case db: DoubleBox => Some(db.dValue)
case _ => None
}
Il che semplicemente non funziona a causa di tipo cancellature.
Il secondo tentativo era una casella generica [T] con tipo T e un membro di tipo astratto ridefinito in ogni sottoclasse. Per esempio:
abstract class Box[T] {def value : T}
class StringBox(val sValue : String) extends Box[String] {
override def value : String = sValue
}
Di conseguenza, posso ri scrivere il mio unapply come:
def unapply[T](b: Box[T]) = b match {
case sb: Box[String] => Some(sb.value)
case bb: Box[Boolean] => Some(bb.value)
case db: Box[Double] => Some(db.value)
case _ => None
Purtroppo, questo non funziona neanche. Quindi immagino che anche il riferimento esplicito al tipo in Box [String] venga cancellato, quindi ho bisogno di usare invece un tipo manifest. Forse qualcosa di simile:
def unapply[T](b: Box[_])(implicit target: Manifest[T]): Option[T] = {
if(b.value == target) Some(b.value.asInstanceOf[T])
else None
}
Questo codice compila (2.10), ma ancora non lo fa la conversione implicita desiderato. Perché?
Domanda semplice, esiste un modo per eseguire l'estrazione dei valori senza utilizzare la riflessione o un manifest?
Ciò che veramente mi fa impazzire è la domanda se esiste un modo semplice (r) per combinare il polimorfismo e la corrispondenza del modello? In caso contrario, ci sono altri modi in Scala per realizzare un effetto simile?
Qualche idea o suggerimento?
Grazie mille.
Sì, questo è tutto. Grazie. –
Il tuo benvenuto .. :) – Shrey