2009-05-31 11 views

risposta

276

La tecnica preferita consiste nell'utilizzare la corrispondenza del modello. Questo consente di gestire con garbo il caso che il valore in questione è non del tipo dato:

g match { 
    case g2: Graphics2D => g2 
    case _ => throw new ClassCastException 
} 

Questo blocco replica la semantica del metodo asInstanceOf[Graphics2D], ma con una maggiore flessibilità. Ad esempio, è possibile fornire diversi rami per vari tipi, eseguendo efficacemente più cast condizionali allo stesso tempo. Infine, non è necessario inviare un'eccezione nell'area catch-all, è inoltre possibile restituire null (o preferibilmente, None) oppure è possibile immettere un ramo fallback che funziona senza Graphics2D.

In breve, questa è davvero la strada da percorrere. È un po 'più sintatticamente ingombrante di asInstanceOf, ma la maggiore flessibilità è quasi sempre la pena.

+19

+1 perché è interessante, ma un po 'troppo per questo scenario, non è vero? –

+0

e se io già modellato, ma ha perso il riferimento al valore castato: base match { case MyConcrete(value) => base.asInstanceOf[MyConcrete].something(value) }, c'è un modo per ottenere "base" castato su MyConcrete anche se si desidera estrarre "valore" sfruttando la chiamata "non valida" eseguita da "caso MyConcrete (valore)"? – ithkuil

+4

Prova questo: 'base match {case base @ MyConcrete (valore) => base.something (valore)}' Ovviamente, l'ombreggiamento 'base' è facoltativo.Potresti usare semplicemente un nome di variabile diverso. –

215
g.asInstanceOf[Graphics2D]; 
+34

Una volta che mi sono abituato a Scala, ho imparato a non usare 'asInstanceOf', poiché sconfigge lo scopo di avere un sistema di tipo statico e si sente schifo. –

+24

Sfortunatamente, questa è un'operazione comune quando si usa Swing. Per le operazioni di verniciatura personalizzate, è necessario eseguire l'override del metodo "public void paintComponent (Graphics g)". Il parametro Graphics è in realtà un'istanza di Graphics2D, ma è necessario un cast. La versione di corrispondenza del pattern è probabilmente più verbosa di quanto garantito. Ricorda: evita sediziosamente l'iperverbosità e la prolissità! – hohonuuli

+7

@hohonuuli Penso che il cast stia bene in quel caso specifico, ma se usi i componenti 'scala-swing', il parametro paintComponent è già Graphics2D quindi non è richiesta alcuna cast –

Problemi correlati