Как я могу привести переменную в Scala?

186

Учитывая переменную с типом Graphics, как мне передать ее в Graphics2D в Scala?

Теги:

2 ответа

262
Лучший ответ

Предпочтительным методом является использование сопоставления шаблонов. Это позволяет вам изящно обрабатывать случай, когда указанное значение не относится к данному типу:

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

Этот блок реплицирует семантику метода asInstanceOf[Graphics2D], но с большей гибкостью. Например, вы можете предоставить разные ветки для разных типов, эффективно выполняя одновременно несколько условных отбросов. Наконец, вам действительно не нужно бросать исключение в область catch-all, вы также можете вернуть null (или предпочтительно None), или вы можете ввести некоторую резервную ветвь, которая работает без Graphics2D.

Короче говоря, это действительно путь. Это немного более синтаксически громоздко, чем asInstanceOf, но добавленная гибкость почти всегда стоит того.

  • 19
    +1, потому что это интересно, но слишком много для этого сценария. не так ли?
  • 0
    Что, если я уже сопоставил с образцом, но потерял ссылку на приведенное значение: <code> base match {case MyConcrete (value) => base.asInstanceOf [MyConcrete] .something (value)} </ code>, есть ли способ получить ' base 'приведена к MyConcrete, даже если вы хотите извлечь "значение", используя вызов "unapply", выполняемый "case MyConcrete (value)"?
Показать ещё 4 комментария
225
g.asInstanceOf[Graphics2D];
  • 35
    После того, как я привык к Scala, я научился не использовать asInstanceOf , поскольку он asInstanceOf необходимость иметь статическую систему типов и чувствует себя отвратительно.
  • 24
    К сожалению, это обычная операция при использовании Swing. Для пользовательских операций рисования вам необходимо переопределить метод public void paintComponent (Graphics g). Параметр Graphics на самом деле является экземпляром Graphics2D, но требуется приведение. Версия для сопоставления с образцом, вероятно, более многословна, чем обоснованная. Помните: соблазнительно избегайте запутывания и гипервозрастности!
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню