Il modo più breve è di progettare la tua applicazione in modo che la tua variabile abbia già .isFlagBlaBla
, rendendo state
già un'istanza di StateA
o rendendo .isFlagBlaBla
un metodo della classe base che stai usando . Questo è il principio base SOLID OOP. Se pubblichi più contesto in un'altra domanda, potremmo aiutarti a refactoring.
A parte questo, non c'è davvero alcun modo per accorciarlo, oltre ad estrarlo in una funzione. I linguaggi funzionali consentono di semplificare praticamente qualsiasi cosa estraendoli in una funzione. Puoi sempre scrivere un abominio come il seguente:
class BaseState() {
import scala.reflect.{ClassTag, classTag}
def castAndTest[A: ClassTag](f: A => Boolean): Boolean =
if (classTag[A].runtimeClass.isInstance(this)) f(this.asInstanceOf[A])
else false
}
class StateA() extends BaseState {
def isFlagBlaBla = true
}
def main(args: Array[String]) {
val baseState: BaseState = new BaseState()
val stateA: BaseState = new StateA()
baseState castAndTest[StateA] {_.isFlagBlaBla} // returns false
stateA castAndTest[StateA] {_.isFlagBlaBla} // returns true
}
I tipi di cast sono estremamente rari nelle lingue con sistemi di tipi potenti come quelli di Scala. Non ho letteralmente mai dovuto farne uno in Scala, e non ricordavo nemmeno la sintassi. Anche nelle lingue con sistemi di tipo medio-resistenti, dovrebbero essere sottoposti a un esame approfondito.