З огляду на змінну з типом Graphics
, як я можу подати її Graphics2D
у Scala?
З огляду на змінну з типом Graphics
, як я можу подати її Graphics2D
у Scala?
Відповіді:
Кращим методом є використання відповідності шаблонів. Це дозволяє витончено обробити випадок, коли значення, про яке йдеться, не має заданого типу:
g match {
case g2: Graphics2D => g2
case _ => throw new ClassCastException
}
Цей блок повторює семантику asInstanceOf[Graphics2D]
методу, але з більшою гнучкістю. Наприклад, ви можете надати різні гілки для різних типів, ефективно виконуючи декілька умовних ролей одночасно. І, нарешті, ви не на самому ділі потрібні , щоб кинути виняток в яскравій всій області, ви могли б також повернутися null
(або , переважно, None
), або ви могли б ввести деяку резервну гілку , яка працює без Graphics2D
.
Коротше кажучи, це дійсно шлях. Це трохи синтаксичніше ніж asInstanceOf
, але додаткова гнучкість майже завжди того варта.
base match { case base @ MyConcrete(value) => base.something(value) }
Очевидно, затінення base
необов’язково. Ви можете так само легко використовувати іншу назву змінної.
val gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
g.asInstanceOf[Graphics2D];
asInstanceOf
, оскільки це перемагає призначення системи статичного типу і відчуває себе щасливим.
scala-swing
компоненти, параметр paintComponent вже є Graphics2D, тому не потрібен