Biorąc pod uwagę zmienną z typem Graphics
, jak ją rzutować Graphics2D
w Scali?
Biorąc pod uwagę zmienną z typem Graphics
, jak ją rzutować Graphics2D
w Scali?
Odpowiedzi:
Preferowaną techniką jest stosowanie dopasowania wzorca. Pozwala to z wdziękiem obsłużyć przypadek, w którym dana wartość nie jest danego typu:
g match {
case g2: Graphics2D => g2
case _ => throw new ClassCastException
}
Ten blok replikuje semantykę asInstanceOf[Graphics2D]
metody, ale z większą elastycznością. Na przykład, możesz podać różne gałęzie dla różnych typów, skutecznie wykonując wiele rzutów warunkowych jednocześnie. Wreszcie, tak naprawdę nie musisz rzucać wyjątku w obszarze catch-all, możesz również powrócić null
(lub najlepiej None
) lub wejść do gałęzi rezerwowej, która działa bezGraphics2D
.
Krótko mówiąc, jest to naprawdę dobra droga. Jest nieco bardziej składniowo nieporęczny niż asInstanceOf
, ale dodatkowa elastyczność prawie zawsze jest tego warta.
base match { case base @ MyConcrete(value) => base.something(value) }
Oczywiście, cieniowanie base
jest opcjonalne. Równie łatwo można użyć innej nazwy zmiennej.
val gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
g.asInstanceOf[Graphics2D];
asInstanceOf
, ponieważ jest to sprzeczne z celem posiadania systemu typu statycznego i czuję się szczęśliwy.
scala-swing
komponentów, parametr paintComponent jest już Graphics2D więc nie wymaga obsada