З огляду на змінну з типом 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, тому не потрібен